iOS 页面之间的相互传值(针对初学者)

 

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性也更强,这些东西都是孰能生巧,没事多使用几次,就熟悉了

 

希望这篇文章能对你有所帮助~

 

posted @ 2016-11-08 13:53  斯文小书生  阅读(292)  评论(0编辑  收藏  举报