iOS中,页面之间的相互传值分为正向传值和逆向传值两种方法
正向传值:A想要传值给B,只要在A中包含B的头文件,并获取到B中.h的属性,在modal或push之前,给B中.h文件中的某属性赋值,即可完成传值
本文主要讲述的是逆向传值的几个常用方法:通知传值、代理传值、block传值
如图所示:
操作流程:
点击控制器A的屏幕,modal到控制器B,然后通过通知/代理/block的方法,给控制器A的UILabel传值,然后再点击控制器B的屏幕,dismiss。
1、通知传值
使用通知从控制器B向控制器A中逆向传值,大概分4步骤
1、必须先有监听者,按照上面图片所示,是控制器A监听通知(获取发布通知的内容),控制器B发布通知(发布通知的内容)
2、拥有监听者,就要移除监听
3、实现监听者中的selector的方法
4、拥有发布者,也就是控制器B
具体操作如下:
第一步:设置监听
按照如上步骤,在控制器A中设置监听者,而设置监听一般只需要设置一次即可,viewDidLoad是控制器加载完成的时候调用的,所以一般是将设置监听者的方法写在viewDidLoad方法中
上面的截图中,是在设置监听者
observer:self,表示在当前的控制器中监听
selector:@selector(capturetext:),表示在监听到发布者发布的通知后,执行当前控制器的capturetext:方法,带:是为了获取通知的内容
name :@“theThirdControllerCapturetext”—>发布通知的名称,需要与发布者的NotificationName相对应
object :nil,表示接受任何地方发布的name是@“theThirdControllerCapturetext”的通知,也可以设置成某个对象
第二步: 移除监听
在上面将讲过,有监听者,就要有移除监听,移除监听分两种,一种是移除当前页面中的所有通知,另一种是移除当前文件中某通知名称的单个通知
两者二选一即可!!! 两者二选一即可!!! 两者二选一即可!!!
第三步:实现监听者中的selector的方法
设置监听者的时候,需要设置selector方法,这个方法在设置监听者的页面实现,接收到通知的时候调用的
在啰嗦一遍:控制器A中有一个UIlabel,在控制器B中想设置控制器A的UIlabel的文字,则在控制器B中发布,以上三步都是在控制器A中实现的,第四部需要到控制器B中实现
第四步:设置发布者
在需要逆向传值的页面中发布通知
上面的截图中,是在设置发布者
NotificationName:@"theThirdControllerCapturetext",发布的通知名称,需要与监听者中的name相对应
object :nil,设置监听者对象,nil表示任何页面的监听者,只要监听NotificationName为@"theThirdControllerCapturetext"的通知,即可获取,也可以置顶某对象
userInfo :字典,需要传递的参数,也就是在控制器A中字典通过@“name”的key即可获取到@“斯文小书生”的值,设置给UILabel的text
至此,通知的传值方法讲解完毕
2、代理传值
使用代理从控制器B向控制器A中逆向传值,大概分7步骤
1、从控制器B的.h文件中使用@class包含本身的类名,然后设置协议的名称及方法
2、从控制器B的.h文件中设置代理的属性
3、从控制器B的.m文件中使用代理的属性,调用协议的方法,并给参数赋值
4、从控制器A的.m文件中包含控制器B的头文件
5、从控制器A的.m文件中遵守协议名称
6、从控制器A的.m文件中初始化控制器B的对象,并将代理设置为self
7、从控制器A的.m文件中调用控制器B的协议方法,获取到参数的值,进行使用
具体操作如下:
1、从控制器B的.h文件中设置协议的名称及方法
2、从控制器B的.h文件中设置代理的属性
3、从控制器B的.m文件中使用代理的属性调用协议的方法,并给参数赋值
4、从控制器A的.m文件中包含控制器B的头文件
5、从控制器A的.m文件中遵守协议名称
6、从控制器A的.m文件中初始化控制器B的对象,并将代理设置为self
7、从控制器A的.m文件中调用控制器B的协议方法,获取到参数的值,进行使用
至此,代理的传值方法讲解完毕
3、block传值
使用block从控制器B向控制器A中逆向传值,大概分7步骤
1、从控制器B的.h文件中使用@class包含本身的类名
2、从控制器B的.h文件中设置block的属性
3、从控制器B的.m文件中给block赋值
4、从控制器A的.m文件中初始化控制器B的对象,并调用block
具体操作如下:
1、从控制器B的.h文件中使用@class包含本身的类名
2、从控制器B的.h文件中设置block的属性
3、从控制器B的.m文件中给block中的参数赋值
4、从控制器A的.m文件中初始化控制器B的对象,调用block,获取到参数的值,进行使用
打印结果:
至此,block的传值方法讲解完毕
其他还有别的传值方式,如单例、NSUserDefaults等,这些的使用频率相对较小
通知、代理和block是使用率较高的逆向传值方法,相对而言,block的传值方式更加简洁,可读性也更高,装B性也更强,这些东西都是孰能生巧,没事多使用几次,就熟悉了
希望这篇文章能对你有所帮助~