一般正向传值基本使用属性传值,这里不多讲。如果需要逆向传值,基本使用代理和block,也可以使用通知。这些基本都会使用,但是平时写的少,所以做一个总结。
1.代理传值
委托方:
<1>.委托方.h文件interface之上写协议
@protocol SendValueDelegate <NSObject>
- (void)sendValue:(NSString*)value;
@end
@interface SecondViewController : UIViewController
<2>.实例化协议变量
@property(nonatomic,assign)id<SendValueDelegate>delegate;
<3>.协议变量响应协议方法(传值)
//一般写在返回方法或viewWillDisappear中
if ([_delegate respondsToSelector:@selector(sendValue:)]) {
[_delegate sendValue:text.text];
}
代理方:
<1>.遵循代理协议
@interface FirstViewController ()<SendValueDelegate>
<2>.设置代理
SecondViewController * Second = [[SecondViewController alloc]init];
Second.delegate = self;
<3>.实现协议方法
- (void)sendValue:(NSString *)value{
label.text = value;
}
做好以上六步,逆向传值不是问题
2.block传值
在进行block传值时,因为block写法比较怪异,所以先对block做一个简单地复习。
先来一个简单的block:
BOOL (^getValue)(int) = ^(int input) {
if (input % 2 == 0) {
return YES;
} else {
return NO;
}};
//调用
getValue(3);
block以后会做深入的分析,接下来主要是传值部分
第一个页面
<1>.先用typedef对block做一个简单的包装
逆向传值时,写在第二个页面头文件的interface之上
typedef void (^sendValueBlock)(NSString * firstValue);
<2>实例化这个block
@property(nonatomic,copy)sendValueBlock valueBlock;
<3>相关方法内对block赋值
- (void)viewWillDisappear:(BOOL)animated{
if(!self.valueBlock){
self.valueBlock(text.text);
}
}
第二个页面
<1>在点击进入下一个页面的方法中进行传值
SecondViewController * Second = [[SecondViewController alloc]init];
Second.valueBlock = ^(NSString * first){
lab.text = first;
};
两种方式传值,block更简易写,缺点是不大容易书写,习惯就好...
3.现在简单谈些notification传值
<1>发送通知,把值写到字典中并赋给userInfo
NSDictionary * dict = [NSDictionary dictionaryWithObject:web forKey:@"website"];
NSNotification * notice = [NSNotification notificationWithName:@"reloadWebview" object:nil userInfo:dict];
[[NSNotificationCenter defaultCenter]postNotification:notice];
<2>接受通知
NSNotificationCenter * reloadCenter = [NSNotificationCenter defaultCenter];
[reloadCenter addObserver:self selector:@selector(reloadWebsite:) name:@"reloadWebview" object:nil];
<3>实现方法
- (void)reloadWebsite:(NSNotification *)notice{
NSString * website = [notice.userInfo objectForKey:@"website"];
}
通知可能更容易理解和书写,但是有时通知太多不太容易跟踪,三者各有各自的好处和适用场景,在此仅以简单记述。