iOS-通知

观察者模式:一种常用的设计模式,一个对象 A想了解另外一个对象B的状态是否发生了改变,在对象B上注册一个观察者,当对象B的状态发生改变时观察者通知对象A
实现下面的方法


image.png

通知的作用

  • 一个对象不用知道消息的接受者是谁,就可以将一些消息发送给需要的接受者;
  • 有时发送消息的对象无法知道有哪些对象,有多少对象接收消息,也不知道这些对象是否存在;
  • 有时消息的接受者离发送者太远


    image.png

自定义通知

新建两个类CCTV1、ZhangsanTV继承NSObject
CCTV1.h声明属性-(void)sendNotification:(NSString*)notiContent;
CCTV1.m

@implementation CCTV1
-(void)sendNotification:(NSString*)notiContent{
    //获取通知中心对象(NSNotificationCenter这是一个单例类)
    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center postNotificationName:@"电视节目" object:self userInfo:@{@"name":@"cctv1",@"sendContent":notiContent}];
    //获取发送方的对象
    //dic["object"]
}

ZhangsanTV.m

#import "ZhangsanTV.h"
@implementation ZhangsanTV
-(instancetype)init{
    if(self = [super init]){
     //向通知中心注册 要接受名字为电视节目的通知
        [[NSNotificationCenter defaultCenter ]addObserver:self selector:@selector(play:) name:@"电视节目" object:nil];
    }
    return self;
}
//NSNotification是接受的通知对象
-(void)play:(NSNotification*)notification{
    NSLog(@"%@",notification);
    NSDictionary *dic = notification.userInfo;
    NSLog(@"%@发送了%@",dic[@"name"],dic[@"sendContent"]);
}
@end

ViewController.m

#import "ViewController.h"
#import "CCTV1.h"
#import "ZhangsanTV.h"
@interface ViewController ()
@property(nonatomic,strong)CCTV1 *cctv1;
@property(nonatomic,strong)ZhangsanTV *zs;
@end

@implementation ViewController
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    [self.cctv1 sendNotification:@"新闻联播"];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self.cctv1 = [[CCTV1 alloc]init];
    self.zs = [[ZhangsanTV alloc]init];
}
  • 在模拟器里面,textfield可以通过电脑键盘输入,可是怎么也不会自动弹出模拟器软键盘 解决办法:点开iOS模拟器,Hardware -> Keyboard -> Toggle Software keyboard.


    image.png

    image.png

    第二步将此处1修改成0.5就改好了


    image.png

    image.png

    注意:Label 的行数要改成0;不然不会根据你说话的多少改变tableView的行高
    image.png

    image.png

发送消息

ViewController.m

#import "ViewController.h"
#import "Message.h"
#import "MessageCell.h"
#import "otherCell.h"
@interface ViewController ()<UITableViewDelegate,UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewBottom;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property(nonatomic,strong)NSMutableArray *allMessage;
@end

@implementation ViewController
-(NSMutableArray *)allMessage{
    if(!_allMessage){
        //mutableCopy将不可变数组转换成可变数组
        _allMessage = [[Message allMessage] mutableCopy];
    }
    return _allMessage;
}
//textField的代理方法
- (BOOL)textFieldShouldReturn:(UITextField *)textField;{
    Message *message = [[Message alloc]init];
    message.me = YES;
    message.message = textField.text;
    //将新的消息对象 添加到数组中
    [self.allMessage addObject:message];
    Message *message2 = [[Message alloc]init];
    message2.me = NO;
    message2.message = @"太喜欢你了,你以后一定会找到工资上万的工作!你是最漂亮的!";
    //将新的消息对象 添加到数组中
    [self.allMessage addObject:message2];
    //刷新tableView
    [self.tableView reloadData];
    [self scrillToTableViewLastRow];
    textField.text = @"";
    return YES;
}
-(void)scrillToTableViewLastRow{
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.allMessage.count - 1 inSection:0];
    [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionBottom animated:NO];
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
//问二:每个分区有多少行
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.allMessage.count;
}
//问三:每行长什么样子
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
    Message *message = self.allMessage[indexPath.row];
    if(message.isMe){
           MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"messageCell" forIndexPath:indexPath];
        cell.messageLabel.text = message.message;
         return cell;
    }
       otherCell *othercell = [tableView dequeueReusableCellWithIdentifier:@"otherCell" forIndexPath:indexPath];
        othercell.label.text = message.message;
        return othercell;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    //键盘 通知的 通知名称
    //UIKeyboardDidShowNotification
    //UIKeyboardWillShowNotification
    //UIKeyboardWillHideNotification
    //UIKeyboardDidHideNotification]
    //设置数据源和代理 也可以在 xib或storyboard中进行设置
    //self.tableView.delegate = self;
    //self.tableView.delegate = self;

    //设置tableView动态行高
    //预设高度为60
    self.tableView.estimatedRowHeight = 60;
    //设置行高 根据内容 自动计算
    self.tableView.rowHeight = UITableViewAutomaticDimension;
    //调用后可以看到最近消息
    [self scrillToTableViewLastRow];
    //给tableView 添加 点击手势
   
}
-(void)tap{
    UITapGestureRecognizer *tap= [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tap:)];
    //设置核心 属性
    //需要几个手指点
    //tap.numberOfTouchesRequired = 2;
    tap.numberOfTapsRequired = 1;
    //将手势添加到视图上
    [self.tableView addGestureRecognizer:tap];
}
//模拟两只手按住alt
-(void)tap:(UITapGestureRecognizer*)gesture{
    [self.view endEditing:YES];
}
//关联轻扫手势 触发的 事件方法
- (IBAction)swipe:(id)sender {
    [self.view endEditing:YES];
}
-(void)viewWillAppear:(BOOL)animated{
    //将要显示需要接受
    [super viewWillAppear:animated];
    //注册接受 键盘 弹起通知
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardOpen:) name:UIKeyboardWillShowNotification object:nil];
    //注册接受 键盘 将要关闭通知
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardClose:) name:UIKeyboardWillHideNotification object:nil];
}
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    //当前对象下全部移除
    [[NSNotificationCenter defaultCenter]removeObserver:self];
    //当前对象下部分移除
//    [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillShowNotification object:nil];
//     [[NSNotificationCenter defaultCenter]removeObserver:self name:UIKeyboardWillHideNotification object:nil];
//
}
-(void)keyboardOpen:(NSNotification*)noti{
    NSLog(@"键盘将要弹起 %@",noti);
    //获取键盘尺寸
   CGRect frame = [noti.userInfo[UIKeyboardFrameEndUserInfoKey]CGRectValue];
    //动画持续时间
    NSTimeInterval duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    self.viewBottom.constant = frame.size.height;
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
    NSLog(@"%f", self.viewBottom.constant);
    [self scrillToTableViewLastRow];
}
-(void)keyboardClose:(NSNotification*)noti{
    //动画持续时间
    NSTimeInterval duration = [noti.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    self.viewBottom.constant = 0;
    [UIView animateWithDuration:duration animations:^{
        [self.view layoutIfNeeded];
    }];
    NSLog(@"键盘将要关闭了");
}
@end

Message.h

@interface Message : NSObject
@property(nonatomic,strong)NSString *message;
@property(nonatomic,assign,getter=isMe)BOOL me;
+(NSArray*)allMessage;
@end

Message.m

#import "Message.h"
@implementation Message
+(NSArray*)allMessage{
    NSMutableArray *array = [NSMutableArray array];
    Message *m = [[Message alloc]init];
    m.message = @"在吗?";
    m.me = YES;
    [array addObject:m];
    
    m = [[Message alloc]init];
    m.message = @"最近好吗?";
    m.me = YES;
    [array addObject:m];
    
    m = [[Message alloc]init];
    m.message = @"在忙吗?";
    m.me = YES;
    [array addObject:m];
    
    m = [[Message alloc]init];
    m.message = @"嗯,在忙!";
    m.me = NO;
    [array addObject:m];
    m = [[Message alloc]init];
    m.message = @"找个时间一起吃个饭吧!";
    m.me = YES;
    [array addObject:m];
    m = [[Message alloc]init];
    m.message = @"呵呵!我先去洗澡了!";
    m.me = NO;
    [array addObject:m];
    m = [[Message alloc]init];
    m.message = @"好吧!多注意身体!";
    m.me = YES;
    [array addObject:m];
    return array;
}
@end

MessageCell.h
@property (weak, nonatomic) IBOutlet UILabel *messageLabel;
otherCell.h
@property (weak, nonatomic) IBOutlet UILabel *label;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272