通知,Block,代理
2016-12-06 本文已影响20人
_wxx
OC中经常要用到一些事件和参数的传递,通常有三种做法:通知 代理 Block
通知可以一对多,代理
通知
1. 发送通知
NSDictionary *dict =[[NSDictionary alloc] initWithObjectsAndKeys:@(self.currentRow),@"cellRow", nil];
//创建通知
NSNotification *notification =[NSNotification notificationWithName:@"ChangeBuyAddShopCartBtnClick" object:nil userInfo:dict];//如果不需要传递参数
//通过通知中心发送通知
[[NSNotificationCenter defaultCenter] postNotification:notification];
2.注册通知
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(todayTeamBuy)name:@"ChangeBuyAddShopCartBtnClick"object:nil];
并在 @selector(todayTeamBuy) 方法中实现你想要的动作
3. 拿到通知传递的参数和调用的方法
- (void)todayTeamBuy:(NSNotification *)noti
{
NSDictionary *dataDic = noti.userInfo;//通知传递的参数
}
4.在dealloc中注销通知
[[NSNotificationCenter defaultCenter] removeObserver:self];
Block
1.逆传数据 (A是B 的父控制器 , B点击按钮改变Label)
B.h
//传值:需要传值的时候,再去调用
@property(nonatomic,strong)void(^valueBlcok)(NSString*str);
B.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent*)event
{
//传值给ViewController
//调用代理方法传值
//if ([_delegate respondsToSelector:@selector(modalViewController:clickScreen:)]) {
//[_delegate modalViewController:self clickScreen:@"123"];
//}
//传值:调用block
if(_valueBlcok) {
_valueBlcok(@"123");
}
}
代理
当A做什么事情不方便的时候,建立一个委托,委托B帮自己去实现方法。这种模式叫作协议 委托,B就是A 的代理.
常见的有UITableView.delegate