美文网首页
代理,通知,block

代理,通知,block

作者: 就算我心狂野 | 来源:发表于2016-05-08 17:50 被阅读65次

    代理的使用:

    代理是一对一.
    首先要在需要传递值的类中声明一个协议

    @protocol WZButtonDelegate <NSObject>
    //可选
    @optional
    //声明一个方法
    - (void)buttonClick;
    @end
    

    在这个类中定义一个delegate的属性,谁是它的代理

    @property (nonatomic,weak) id<WZButtonDelegate> delegate;
    

    在该类中当按钮要被点击的时候告诉他的代理,让代理去做事情

    //为了防止程序崩溃,我们需要判断一下,是否实现了该方法.
    if ([self.delegate respondsToSelector:@selector(buttonClick)]) {
        //执行代理方法
        [self.delegate buttonClick];
    }
    

    在代理对象遵守协议,成为代理.并实现代理方法.

    //                           遵守协议
    @interface ViewController ()<WZButtonDelegate>
    //让控制器成为按钮的代理
    button.delegate = self;
    //实现代理方法
    - (void)buttonClick {
        NSLog(@"控制器接受到了通知");
    }
    

    通知的使用:

    通知可以一对多.

    //创建通知中心
    /** 
      * 观察者注册消息通知 
      * @param addObserver 观察者 self 
      * @param selector 回调方法 notification 
      * @param name 消息的名称 notifitionMassage
      * @param object 发送消息的对象,表示接收哪个发送者的通知,如果第四个参数为nil,则接收所有发送者的通知。 
      */
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(notification:) name:@"notifitionMassage" object:nil];
    

    发送消息

    /** 
      * 发送消息通知 
      * @param postNotificationName 发送消息的名称 notifitionMassage 这里一定要和观察者中消息的名称一致,否则监测不到消息 
      * @param object 发送消息的对象 如果这里填nil,而且观察者要监测同时监测了好几个消息,但是这里我们只需要这一条特定的消息的时候,此时就无法达到我们想要的结果了。 
      */
    [[NSNotificationCenter defaultCenter]postNotificationName:@"notifitionMassage" object:nil];
    

    观察者回调的方法

    /** 
      * 观察者处理消息(这个方法也就是观察者的回调方法) 
      * @param massage 接收到消息的信息,主要用于传值。(里面包含了Name:消息的名称 object:消息的发送者 userInfo:消息传递的数据信息) 
      */
    -(void)notification:(NSNotification *)massage{ 
      //在这里做我们想要的操作
    }
    

    注销观察者

    -(void)dealloc{ 
    /** 
      * 移除观察者的方法 
      * @param removeObserver 监听的对象 self 
      * @param name 消息的名称 
      * @param object 发送消息的对象 如果发送消息的时候填写了对象,那么这里就是那个对象 
      */
    [[NSNotificationCenter defaultCenter]removeObserver:self];
    
    /** 移除单个观察者 */
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"notifitionMassage" object:nil];
    }
    

    block:

    block是一个事先准备好的代码块,在调用的时候才执行.
    定义一个block的属性

    //定义一个block
    typedef void(^block)(NSString *str);
    //设置为属性
    @property (nonatomic,copy) block string;
    

    执行block方法

    //调用方法时,进行判断防止没有实现方法出现报错的问题
    if (self.string != nil) {
        self.string(@"按钮");
    }
    

    在控制器中执行block

    //控制器中执行的方法.
    btn.string = ^(NSString *str) {
        [btn setTitle:str forState:UIControlStateNormal];
    };
    

    相关文章

      网友评论

          本文标题:代理,通知,block

          本文链接:https://www.haomeiwen.com/subject/isbsrttx.html