ios开发中控制器与控制器之间的传值与联系,使用最多的是block,代理,通知.那么他们之间有什么区别以及怎么使用的呢,下面一一道来.
-
block的使用,特点:简单易用,简洁.
一般使用存代码时,避免不了涉及到对象/控制器之间的传值,那么一般最常用的就是block,block的使用必须是2个控制器/对象之间具有关联性,例如在一个uiviewcontroller钟加入tableview,如若要把cell中的值或者点击事件传到控制器,那么必须先传到tableview,再传到控制器.代码如下
- cell在该方法中将model的数据传给tableview中的didClickButton:model.方法
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
self.myCell.didButton = ^(AroundMainModel* model){
[weakSelf didClickButton:model];
};
}
- 在tableview的didClickButton中通过block将Model传给控制器
-(void)didClickButton:(AroundMainModel*)model{
if (self.didButton) {
self.didButton(model);
}
}
//在控制器中接收到Model.
_historyAddressTableView.didButton = ^(AroundMainModel* model){
[weakSelf didClickButton1:model];
};
- 然后在控制器中的该方法就会调用,达到点击cell中的方法,触发控制器中的方法,并将cell中的数据传给控制器.
-(void)didClickButton1:(AroundMainModel*)model{
AddCommonPathViewController *addVC = [[AddCommonPathViewController alloc]init];
addVC.model = model;
[self.navigationController pushViewController:addVC animated:YES];
}
-
通知的使用.特点:一对多传值,控制器与控制器之间可以没有关联.
一般在一个点有改动,需要其他点做出反应时使用.简单的代码如下:
- 发出通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"EnterForeground" object:nil];
- 接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(appGoBackgroud) name:@"EnterForeground" object:nil];
- 在接收通知的方法中写接到通知后的操作.
-(void)appGoBackgroud{
self.goBackgroundDate = [NSDate date];
}
- 移除通知,控制器销毁时需要移除通知.如果不移除,因为该控制器已经销毁,当发出通知时,程序就会崩溃.
-(void)dealloc
{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}
- 注:如果通知中需要传值的话,在发出的通知中,加入userinfo,格式为字典.
[[NSNotificationCenter defaultCenter]postNotificationName:@"timeGone" object:nil userInfo:@{@"timeGone":[NSString stringWithFormat:@"%F",timeGone]}];
- 然后在接收通知时,就可以在通知的方法中获取到NSnotification对象该对象有userinfo属性,他就是我们在通知中传输的信息.
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(timeGone:) name:@"timeGone" object:nil];
-(void)timeGone:(NSNotification*)noti{
NSLog(@"%@",noti);
NSString* timeGone = [noti.userInfo valueForKey:@"timeGone"];
-
代理的使用.代理的使用与block类似,他也是一对一传值,使用上更加直观.代码省略,没事多百度.