正向传值:
一、利用present 的 block 块进行正向传值
RootViewController.m中:
SubViewController * svc = [[SubViewControlleralloc]init];
//svc.label.text = @"正向Block传值";
//这句是正向的属性传值,作用是让B页面,能持有A页面的地址,因B要向A进行反向传值
//想给谁传值,就要持有谁的地址
svc.delegate =self;
[selfpresentViewController:svc animated:YEScompletion:^{
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:@"****"];