代理,通知,block

代理的使用:

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

@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];
};
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容