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

 

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

 

转载于:https://www.cnblogs.com/siwenss/p/6042783.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值