美文网首页iOS基础iOS基础知识iOS笔记
iOS - 页面之间几个常用的传值方式

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

作者: 我常常问自己我是谁 | 来源:发表于2018-09-06 14:47 被阅读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传值---------------------------

    相关文章

      网友评论

        本文标题:iOS - 页面之间几个常用的传值方式

        本文链接:https://www.haomeiwen.com/subject/swtrwftx.html