代理的使用:
代理是一对一.
首先要在需要传递值的类中声明一个协议
@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];
};