正向传值:
一、利用present 的 block 块进行正向传值
RootViewController.m 中:
SubViewController * svc = [[SubViewController alloc]init];
//svc.label.text = @"正向Block传值";
//这句是正向的属性传值,作用是让B页面,能持有A页面的地址,因B要向A进行反向传值
//想给谁传值,就要持有谁的地址
svc.delegate = self;
[self presentViewController:svc animated:YES completion:^{
svc.label.text = @"正向Block传值";
}];
二、利用AB页面中的属性传值
反向传值:
一、利用block来进行 b 界面向 a 界面反向传值
a 中声明一个 block 属性,将所要传的值放入block 函数指针中,b 去接收
.h文件
@property(nonatomic,copy) void(^blockColor) (UIColor *);
.m 文件
self.blockColor([UIColor blackColor]);
注意用 copy
b.m 文件中 接收
svc.blockColor = ^(UIColor *color){
self.view.backgroundColor = color;
};
二、通知中心和观察者模式反向传值
例: viewController1 向 viewController2传值
1.
Appdelegate 文件中,有一个接收所要传递的值的变量,用来保存所要传递的数据,界面1写入,界面2读取
@property (nonatomic,copy)NSString *string;
2.
viewController1 中,当要传值的时候(按钮按下时),将数据通过UIApplication 单例获取到的Appdelegate *delegate,传入Appdelegate 文件中。同时向通知中心发送一个广播
[[NSNotificationCenter defaultCenter] postNotificationName:@"鬼子来了" object:nil];
3.
viewController2 中 ,向通知中心注册,添加自己,成为观察者。当数据改变时,用单例delegate 读取数据
-(void)becomObserver
{
//获得通知中心,注册成观察者
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeText) name:@"鬼子来了" object:nil];
}
//收到广播消息后调用 的方法
-(void)changeText
{
//首先获取appDelegate的对象
AppDelegate * appDeleagte = [UIApplication sharedApplication].delegate;
NSString * string = appDeleagte.string;
NSLog(@"sss:%@",string);
label.text = appDeleagte.string;
NSLog(@"label.txt = %@",label.text);
}
三、利用协议,界面反向传值
AppDelegate
viewController2为委托方,viewController1为代理,
在viewController2 中委托方制定协议,并且属性delegate = viewController1,要遵循协议;
在viewController1 中,将viewController2对象的属性delegate 设为自己(vc1)
1.ViewController1.m
vc2.delegate = self;
2.ViewController2.h文件
//委托方制定协议,代理人必须遵守
@protocol BackValueDelegate<NSObject>
-(void)changeText:(NSString *)string
@end
@interface ViewController1 :UIViewController
//用来设置代理,并且遵守协议
@property (nonatomic,retain) id<BackValueDelegate>delegate;
@end
3. ViewController2.m 文件
//利用代理去回传数据
[self.delegate changeText:@"****"];
四、用系统自带的UIApplication单例进行传值
五、用自己实现的单例进行传值
六、用TargetAction 的方式进行两个界面来回反复调用传值
常用的是详细写的几种