一:通知传值:可以实现任意界面的传值(A想让B执行一个方法)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(ChangeNameNotification:带参数的通知) name:@"ChangeNameNotification" object:nil];
再在A控制器中实现ChangeNameNotification:方法
-(void)ChangeNameNotification:(NSNotification*)notification{
NSDictionary *nameDictionary = [notification userInfo];//接收信息
self.textLabel.text = [nameDictionary objectForKey:@"name"];
二:属性传值:是最简单的,但局限性也是最大的,仅限于从A页面push到B页面时用B的属性把值传过去,仅适用于两个有联系的Controller之间
三:代理传值
代理传值有一个委托人和一个代理人,委托人会把自己想要做的事指定别人去做,这里的别人就指的是我们的代理人,委托人在指定代理人时将他想要做的事的相关信息会以参数的形式传递过去
比如我现在有两个ViewController:RootViewController和secondViewController RootViewController上面有一个push的button,点击button会推出secondViewController,sencondView上面有一个TextField,当我pop到rootViewController的时候会把TextField里面的内容显示在RootViewController的label上,用代理的解决方法就是让sencondViewController作为委托人,委托我们的RootViewController当代理人,这样我就可以在委托secondViewController做事的时候把我的TextField的文本信息以参数的形式传递给RootViewController,这样RootViewController的label上就能显示我的文本值了,具体步骤如下:
SecondViewController.h
1:先要通过协议制定一个规范(这个规范是由委托人来制定)可能有人会问为什么是委托人来制定呢,很简单,只要想一下老板让你干的事难道规范要由你来指定吗,而且这套规范是对所有的代理人都适用的,所以也应该由委托人来制定
@protocol SencondDelegete<NSObject>
-(void)setLableText:(NSString *)str;//这是我们协议里面的内容,所有的代理人都要执行这个协议
@end
@property(nonatomic,assign)id<SencondDelegete>delegate;
-(void)back{
[self.delegete setLableText:self.tf.text];
[self.navigationController popToRootViewControllerAnimated:YES]
}
RootViewController.m
4:在RootViewController中导入委托类,在接口处声明代理
#import "secondViewController.h"
@interface ViewController : UIViewController<SencondDelegete>
-(void)push{
secondViewController *sencondVc =[[secondViewController alloc]init];
sencondVc.delegete = self;
[self.navigationController pushViewController:sencondVc animated:YES];
}
6:在这个代理方法里就获得了委托类发送给你的信息
-(void)setLableText:(NSString *)str {
self.label.text = str;
}
四:block传值 :我要把B中的值传给A(A push 到B,B pop到A)
@property(nonatomic,copy)void(^Thirdblock)(NSString *str);//注意这里的属性必须为copy,不然会报错 *Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的
B.m
if (self.Thirdblock) {
self.Thirdblock(self.tf.text);
}
B *thirdVc =[[B alloc]init];
thirdVc.Thirdblock = ^(NSString *str){
self.blockLable.text = str;
};