代理(delegate)、通知(NSNotification),block等等。
1、委托代理delegate只能是一对一之间的。他只能是navigation的栈里面的相邻控制器传值, 不能跨控制器传值。
比如:a到b,b到c.,而不能从c传到a。
@protocol PassValueDelegate
@optional
- (void)VCValuePass:(UIViewController*)VC;
@end
@property(assign,nonatomic)id delegate;
if([self.delegate respondsToSelector:@selector(VCValuePass:)]){
[self.delegateVCValuePass:self];
[self.navigationController popViewControllerAnimated:YES];
}
2、通知(NSNotifacation)
通知的用处就随意多了, 首先他是多对多传值的, 不过要先注册成为监听者,才能收到通知。简单、便捷。不用通知的时候,记得移除。
2.1.发出通知 // object通知发布者(是谁要发布通知)userInfo:一些额外的信息(通知发布者传递给通知接收者的信息内容)
NSDictionary* dic =@{ @"name":@"等等", @"sex":@"女"};
NSString* address =@"哥哥";[[NSNotificationCenterdefaultCenter]postNotificationName:@"ValuePass"object:addressuserInfo:dic];
2.2.注册监听对象 name通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知; Object通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知
[[NSNotificationCenter defaultCenter] addObserver:selfselector:@selector(receiveValue:)name:@"ValuePass"object:nil];
- (void)receiveValue:(NSNotification* ) notification {
NSLog(@"%@, %@",notifi.object, notifi.userInfo);
}
在注册成为监听者的页面, 要注意移除通知
- (void)receiveValue:(NSNotification* )notification{
NSLog(@"%@, %@",notifi.object, notification.userInfo);
}
3.1 Block 传值
.h 文件
typedef void (^newBlock)(NSString *);
@interface TwoViewController : UIViewController
// 声明block属性
@property (nonatomic, copy) newBlock block;
@end
.m 文件
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:YES];
if (self.block != nil) {
self.block(@"呵呵");
}
}
3.2 其实用Block 用于回调执行一些方法更方便
使用场景 a 跳转到 b 进行一些事件处理后需要重新回到a ,例如让a 刷新UI,请求数据等等,可以在a 中重写该block 的setter 方法。