iOS基础iOS基础知识iOS笔记

iOS - 页面之间几个常用的传值方式

2018-09-06  本文已影响22人  我常常问自己我是谁

什么是页面传值??
页面传值:既不同视图控制器之间数据传递的过程
页面传值描述:
页面一:有两个控件分别是展示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.h

1)在 A-2-ViewController.h 中声明一个NSString。方便接收从页面一种传来的值

A-2-ViewController.m

2)声明两个控件,分别是UITextfield和UIButton
3)懒加载这两个控件,其中UIButton的名字叫跳转页面一,并添加点击事件(方法名自己起)

添加视图和button事件

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 点击事件,

------------------开始单例传值 --------------------
》》》》》正向传值《《《《《
页面一
正向传值 - 赋值

BViewController

1)在页面一中button点击事件中给单例类属性赋值,并跳转页面二;如上图

页面二
正向传值 - 接收,并赋值


B-2-ViewController

2)在UITextfield懒加载中接收,并赋值

从页面一传值到页面二,页面二接收并赋值显示界面,这叫正向传值

》》》》》反向传值《《《《《
页面二
反向传值 - 赋值

B-2-ViewController

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.h

1)声明两个控件,分别是UITextfield和UIButton,并且实现懒加载

C-2-ViewController.h

2)把两个控件添加到父视图上(self.view)
3)实现 UIButton 点击事件,并且实现模态跳转到页面一

------------------开始 NSUserDefaults 传值--------------------
NSUserDefaults - 正向传值
页面一

button点击事件

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传值---------------------------

上一篇下一篇

猜你喜欢

热点阅读