iOS - 页面之间几个常用的传值方式
什么是页面传值??
页面传值:既不同视图控制器之间数据传递的过程
页面传值描述:
页面一:有两个控件分别是展示label和跳转到页面二的button
页面二:有两个控件分别是TextField和传值给页面一的button
页面传值常用的都有哪几个??
页面传值分别有:
属性传值
单例传值
NSUserDefaults传值
代理传值
block传值
通知传值;
接下来看一下这几个传值方法是怎么使用的:
1.先分别创建两个不可变的数组(NSArray)和声明一个表(UITableView),并且把表的两个代理方法写上并实现代理方法
声明数组和表1.1 声明好数组和表后,然后开始创建数组和表的懒加载
数组和表的懒加载1.2 分别创建六个类(这里我就就用A/B/C/D/E/F来区分类名)
类名
1.3 分别在数组里添加数据,并把表(UITableview)添加到父视图上
在数组中添加数据,并把子视图添加到父视图上
1.3.1 vcArr数组内添加的是六个类名,vcTitleVC数组内添加的是六个传值方式的名称。由于懒加载的原因,在向父视图添加子视图时,需要使用 self. 和表的指针来组合添加,数组在添加数据时,也要加上self. 来组合数组指针来使用
1.3.2 实现表的代理,并把数组中的赋值给cell的两个label
实现代理
1.3.3 其他代理就不多说了,就只说一下cell点击事件,其中画红色线的是重要部分,它可以把所有的类通过类名来进行跳转界面
cell点击事件
这些工作准备好后,就开始一个一个介绍传值的写法
在每个类都会配一个类,如:AViewController类会配一个A-2-ViewController、BViewController类会配一个B-2-ViewController,以此类推; 这连个界面分别叫界面一和界面二
如图:
界面一和界面二
每个界面一都要创建两个懒加载,分别是UILabel、UIButton两个控件
界面一的两个懒加载
每个界面二都要创建两个懒加载,分别是UITextField、UIButton两个控件
界面二的两个懒加载--------------------------属性传值 -- 这就是个分割线----------------------------
2 属性传值
属性传值可以实现:正向传值(也就是说 上级页面 向下级传值),
而所需要的连接是 页面二中 .h 文件中声明的属性,注意:必须在 .h 中声明,不能在 .m 文件中声明,如果你声明的属性在 页面一中报错,那么首先你要看看属性声明的位置是否是在 .h 写的,然后在进行其他的排查
不多说直接上代码,不过是图片
------------- 页面一 -------------
页面一1)导入A-2-ViewController,创建A-2-ViewController到下面看页面二
2)声明两个控件,分别是UILabel和UIButton
3)懒加载这两个控件,其中UIButton的名字叫跳转页面二,并添加点击事件(方法名自己起)
添加视图和button事件
4)在 viewDidLoad 方法中把两个控件添加到父视图上(self.view)
5)把 button 的点击事件实现
6)在 button 点击事件中初始化 A-2-ViewController ,并使用模态进入 A-2-ViewController 界面(也就是页面二)
------------- 页面二 -------------
A-2-ViewController.h1)在 A-2-ViewController.h 中声明一个NSString。方便接收从页面一种传来的值
A-2-ViewController.m2)声明两个控件,分别是UITextfield和UIButton
3)懒加载这两个控件,其中UIButton的名字叫跳转页面一,并添加点击事件(方法名自己起)
4)把两个控件添加到父视图(self.view)
5)实现 button 点击事件
6)在 button 事件中写上退出模态
开始属性传值
7)回到页面一的button事件中,在 A-2-ViewController 类初始化下面使用类的指针带点调 A-2-ViewController 的 str 属性,并且给 str 属性赋值(因为这个是 NSString,所以在赋值的时候,只能传字符串)
接收并显示8)回到页面二,在 UITextfield 的懒加载中把接收到的值,赋值给UITextfield的 text 属性
-------------------------单例传值---------------------------
3 单例传值
单例传值可以实现:正向传值、反向传值、跨页面传值
单例传值是这六种传值方式中唯一一个需要创建类文件的传值方式(当然除了封装),因为它需要继承 NSObject 才可以传值,而ViewController.h 和 .m 文件 是继承 UIViewController 不能在其文件中创建单例传值,只能在其文件中使用
----------------------- 页面一 ------------------------
单例类
1)先创建一个单例类
2)在单例类中声明一个 NSString 属性,再写一个 加号方法
3)在单例类的 .m 中实现加号方法(里面写的什么意思我就不说了,自行百度)
BViewController类4)导入B-2-ViewController,创建B-2-ViewController到下面看页面二
5)导入单例类
6)声明两个控件,分别是UILabel和UIButton,并分别实现懒加载
BViewController类
7)把两个懒加载的控件添加到父视图上(self.view)
8)实现 UIBUtton 的点击事件
9)在UIButton中初始化 B-2-ViewController 类,然后在使用单例类赋值,最后模态跳转到页面二
---------------------- 页面二 ---------------------
B-2-ViewController
1)导入单例类 .h 文件
2)声明两个控件,分别是UITextfield和UIBUtton,并懒加载两个控件
1535959498402.jpg
3)把两个控件添加在到父视图上(self.view),并且实现 UIButton 点击事件,
------------------开始单例传值 --------------------
》》》》》正向传值《《《《《
页面一
正向传值 - 赋值
1)在页面一中button点击事件中给单例类属性赋值,并跳转页面二;如上图
页面二
正向传值 - 接收,并赋值
B-2-ViewController
2)在UITextfield懒加载中接收,并赋值
从页面一传值到页面二,页面二接收并赋值显示界面,这叫正向传值
》》》》》反向传值《《《《《
页面二
反向传值 - 赋值
1)在页面二的button点击事件中,给单例类属性赋值,然后返回到页面一
页面一
反向传值 - 接收,并赋值
BViewController
2)回到页面一后,需要在 - (void)viewWillAppear:(BOOL)animated 方法中接收,并赋值
》》》》》跨页面传值《《《《《
跨页面传值没有写,其实,和正向传值、反向传值的步骤一样的,只不不是上下级页面传值而已。
描述:
页面分别有:页面一、页面二、页面三,它们的关系是一级页面、二级页面、三级页面;
问题描述:
页面一需要跨过页面二,直接传值给页面三,也就是说一级页面在不通过二级页面的情况下,直接传值给三级页面
解决办法:
其实,和正向传值、反向传值的使用步骤一样的
自己可以去试一下!
-------------------------NSUserDefaults传值---------------------------
4 NSUserDefaults传值
NSUserDefaults传值可以实现:正向传值、反向传值、跨页面传值
页面一
CViewController.h
1)导入 C-2-ViewController.h 类名
2)声明两个控件,分别是UILabel和UIButton,并且实现懒加载
CViewController.h
3)把两个控件添加到父视图上(self.view)
4)实现 UIButton 点击事件,在点击事件中创建并初始化 C-2-ViewController.h ,并且实现模态跳转到页面二
页面二
C-2-ViewController.h1)声明两个控件,分别是UITextfield和UIButton,并且实现懒加载
C-2-ViewController.h2)把两个控件添加到父视图上(self.view)
3)实现 UIButton 点击事件,并且实现模态跳转到页面一
------------------开始 NSUserDefaults 传值--------------------
NSUserDefaults - 正向传值
页面一
1)页面一在 button 的点击方法中使用NSUserDefaults,在setObject:@“这里是传值”,forKey:@"这里是写 key(key是随意写的,但在获取传的值时,需要使用同一 key)"
2)赋值和写完key后,需要同步一下,注意:如果不同步,把你在其他页面会获取不到值
页面二
页面二接收,并赋值1)在页面二的UITextfield懒加载中获取,并赋值给UITextfield的text属性
2)在获取的时候,如果key不一样,会获取不到该有的内容
NSUserDefaults - 反向传值
页面二
页面二 - button点击事件1)在页面二的button点击事件中写NSUserDefaults的传值与key,然后同步一下
2)这时在退出模态界面
页面一
页面一 - 获取,并赋值
1)在页面一的 - (void)viewWillAppear:(BOOL)animated 的方法中,获取并赋值给UILabel的text属性
2)从页面二返回到页面一,页面一被触发的方法就是- (void)viewWillAppear:(BOOL)animated 方法
NSUserDefaults - 跨界面传值
跨页面传值没有写,其实,和正向传值、反向传值的步骤一样的,只不不是上下级页面传值而已。
描述:
页面分别有:页面一、页面二、页面三,它们的关系是一级页面、二级页面、三级页面;
问题描述:
页面一需要跨过页面二,直接传值给页面三,也就是说一级页面在不通过二级页面的情况下,直接传值给三级页面
解决办法:
其实,和正向传值、反向传值的使用步骤一样的
自己可以去试一下!
-------------------------代理传值---------------------------
代理传值可以反向传值,一对一的传值,必须两个页面建立代理关系才可以进行传值;
代理传值不能可以正向传值,只能反向传值和跨界面传值
页面一
代理传值 - 页面一
1)导入页面二类名
2)声明两个控件,分别是UILabel和UIButton,并且实现懒加载
代理传值 - 页面一
3)把懒加载的两个控件添加到父视图上(self.view)
4)在UIButton点击事件中创建并初始化页面二的类名,然后使用模态跳转到页面二中
页面二
页面二 - 创建、并声明代理协议1)创建代理协议,并声明协议
页面二 - 声明、并创建懒加载
2)声明两个控件,分别是UITextfield和UIButton,并实现懒加载
------------------开始代理传值 --------------------
》》》》》反向传值《《《《《
页面二
代理传值 - 赋值,并跳转页面一1)在页面二的UIButton点击事件中把代理方法写出来,并传值
页面一
页面一 - 接收,并赋值
2)在页面一的UIButton点击方法中,也就是在初始化页面二类名下面使用指针调用代理
3)实现代理方法,并赋值
》》》》》跨界面传值《《《《《
跨页面传值没有写,其实,和正向传值、反向传值的步骤一样的,只不不是上下级页面传值而已。
描述:
页面分别有:页面一、页面二、页面三,它们的关系是一级页面、二级页面、三级页面;
问题描述:
页面三需要跨过页面二,直接传值给页面一,也就是说三级页面在不通过二级页面的情况下,直接传值给一级页面
解决办法:
其实,和反向传值的使用步骤一样的
自己可以去试一下!
-------------------------block传值---------------------------