ios -- 监听方法总结

发送通知

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

<span style="font-size:12px;">//某人发送了一个名为大新闻的通知,通知附带内容info
NSNotification *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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值