ios -- 监听方法总结

来源:互联网 发布:手机淘宝的二手在哪里 编辑:程序博客网 时间:2024/05/16 15:03

发送通知

发送通知的目的是用来给外部一些信息,供外部的控制器来监听发送通知的对象内部的一些行为。

<span style="font-size:12px;">//某人发送了一个名为大新闻的通知,通知附带内容infoNSNotification *note = [NSNotification notificationWithName:@“大新闻” object:self userInfo:@{    @“time” : @“2015.6.1"      @“desc” : @“也没什么大新闻"        }];[[NSNotificationCenter defaultCenter] postNotification:note];</span>
有人发送,就会有人接收,假设有另一个模拟机接收通知:
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];

  • 监听某个行为,第一反应:用代理来监听行为
  • 以下两个方法都能监听行为:
    • 观察者模式(通知机制)
    • 代理模式:如何设计一个代理模式?

      代理模式

      • 定义一个协议:
        协议的格式:控件名 + Delegate,在协议里面声明一些代理方法(一般代理方法都是@optional)
        按照苹果官方的命名样式来定义方法名:
        @protocol JWLoadMoreFooterDelegate <NSObject>@optional-(void)loadMoreFooterDidClickLoadMoreButton:(JWLoadMoreFooter *)footer;
        • 声明代理属性
        @property (nonatomic, weak) id<JWLoadMoreFooterDelegate> delegate;

        想要用代理方法,就要遵循代理的协议
        用weak是防止出现循环引用。
        原理图如下:

        • 在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
        • 设置代理,(先让控制器称为footer的代理)
          footer.delegate = self;
        • 遵守协议
          <JWLoadMoreFooterDelegate>
        • 调用代理中的方法
          [self.delegate loadMoreFooterDidClickLoadMoreButton:self];

          • 总结:设置了代理以后,可以监听代理方法
            如果你想监听别人的一些行为,那么就要称为别人的代理;
            如果你想告诉别人一些内部的事情,那么就让别人称为你的代理。

          使用者:遵守协议—>设置代理—>使用代理中的方法来监听

          • 告诉代理有没有实现这个方法
            if([self.delegate respondsToSelector:@selector(…)]){
            [self.delegate loadMoreFooterDidClickLoadMoreButton:self];
            }
            如果实现这个方法,那么就调用这个代理方法。如果没有实现就不调用。

          代理和通知的区别

          • 代理:1个对象只能告诉1个代理
          • 通知:1个对象可以告诉多个代理,内部只要发了一个通知,外部只要有人接收都可以监听到。

          另一种监听方式-KVO

          • KVO(Key Value Observing)
            常用作用:监听模型属性值的改变
            下面是KVO的一个例子,细节的说明已经写在注释当中:
          self.p1 = [[JWPerson alloc] init];self.p1.name = @“p1”;//self监听了self.p1的name属性的改变[self.p1 addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];self.p1.name = @"pppp1";#pragma mark - KVO监听方法//self得实现监听方法/***当监听到object的keyPath属性发生了改变*///这个方法继承于NSObject,所以不需要遵守其他协议,任何对象都可以调用这个方法//改变了object的哪个值(KeyPath),改成了什么(字典change)- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{    NSLog(@"监听到%@对象的%@属性发生了改变, %@", object, keyPath, change);}
          • 总结KVO:
            • 对象自己添加观察者,监听对象的属性的改变
              KVC:常见作用:给模型属性赋值
          • 注意点
            • 无论是KVO还是通知,监听完后都要将观察者销毁
          -(void)dealloc{    [[NSNotificationCenter defaultCenter] removeObserver:self];}

          addTarget方法

          • addTarget方法是最基本的监听方法,对象可以调用该方法,实现对其他对象的监听,同时也可以设置调用其他的方法。
          - (void)addTarget:(id)target action:(SEL)action






0 0
原创粉丝点击