美文网首页
IOS界面传值的几种方式

IOS界面传值的几种方式

作者: 笑望書 | 来源:发表于2017-12-06 10:39 被阅读0次

    在进行页面跳转时,往往都需要携带数据,以便于对界面进行数据的初始化,方便用户查看一些信息、状态等,以下是本人在开发时总结的界面传值的几种方式:

    一、属性传值

    属性传值即在页面进行跳转时,直接给将要跳转的页面中的指定属性进行赋值操作,我们以页面一跳转到页面二为例,页面一仅有一个跳转按钮,跳转代码如下:

    -(void)doJump

    {

    SecondViewController *secondVC = [[SecondViewController alloc] init];

    secondVC.str = @"这是页面一给我设置的";

    [self presentViewController:secondVC animated:YES completion:nil];

    }

    从代码可看出,在跳转到SecondViewController之前,我们先给secondVC对象中的str属性赋值了,那么在secondVC界面初始化时,即可去读取并显示str中的数据了,以下是页面二的部分代码,在跳转前,给页面二指定的属性赋值即可;

    @interface SecondViewController : UIViewController

    @property (strong,nonatomic) NSString *str;

    @end

    二、单例传值   

                                                                                                                              通过单例对象来传递数据,首先创建一个单例类,并在其中定义并实现静态的单例构造方法,获取唯一的单例对象,同时在单例类中添加指定的属性,SingleInstance.h代码如下:

    @interface SingleInstance : NSObject
    @property (strong,nonatomic) NSString *singleStr;
    +(instancetype)sharedInstance;
    @end

    以下是SingleInstance.m代码

    @implementation SingleInstance

    //通过类方法创建单例对象

    +(instancetype)sharedInstance

    {static SingleInstance *instance = nil;

        if (instance == nil) {

          instance = [[SingleInstance alloc] init];

         }return instance;}

    @end

    单例类创建完成后,在进行页面跳转前,对单例对象中的指定属性进行赋值,然后在跳转后的页面中再读取单例对象中指定的属性值,代码如下:

    -(void)doJump
    {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        [SingleInstance sharedInstance].singleStr = @"这是单例传值";
        [self presentViewController:secondVC animated:YES completion:nil];
    }

    三、NSUserDefaults传值

    NSUserDefaluts是系统提供的一种方法,在页面一中先传入数据到程序的沙盒当中,然后在页面二中再从沙盒中读取数据,代码如下:

    页面一:[[NSUserDefaults standardUserDefaults] setObject:@"这是NSUserDefaults传值" forKey:@"NSDefaults"];

    通过键值对的方式存储数据,再在页面二中通过key值读取指定的数据

    页面二:_label.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"NSDefaults"];

    四、block传值

    block传值主要用于页面二给页面一回传数据,即进行页面的反向传值,首先需要在页面二中添加block属性,我们以传递NSString为例,代码如下:

    //定义一个block,进行页面反向传值

    @property (copy) void (^block)(NSString *);

    其次在页面二返回到页面一时,给这个block进行传参,代码如下:

    -(void)doClick

    {

        //block传值,反向传值

        self.block(@"block传值啦");

        [self dismissViewControllerAnimated:YES completion:nil];

    }

    在页面一中,我们需要实现页面二中的block属性进行读取数据的操作,代码如下:

    -(void)doJump

    {

    SecondViewController *secondVC = [[SecondViewController alloc] init];

    //block传值,实现block,接收来自页面二的值

    secondVC.block = ^(NSString *str){

    self.label.text = str;

    };

    [self presentViewController:secondVC animated:YES completion:nil];

    }

    五、代理传值

    通过代理传值,实现页面二反向传递数据给页面一,实现步骤如下:

     a.委托方(页面二)持有协议并调用协议方法,代码如下:

    #import <UIKit/UIKit.h>

    //委托方创建一个协议

    @protocol sendDataDelegate <NSObject>

    //协议定义一个传值的方法

    -(void)sendData:(NSString *)str;

    @end

    @interface SecondViewController : UIViewController

    //定义一个持有协议的ID指针

    @property (weak)id<sendDataDelegate> delegate;

    @end

    b.委托方(页面二)在跳转至代理方(页面一)时调用协议方法

    -(void)doClick
    {
        //代理传值,反向传值
        [self.delegate sendData:@"代理传值啦"];
        [self dismissViewControllerAnimated:YES completion:nil];
    }

    c.代理方(页面一)遵守协议并实现协议的方法

    @interface ViewController ()<sendDataDelegate>

    @end

    @implementation ViewController

    //代理传值,实现协议方法,接收页面二传递的值,sendData为sendDataDelegate协议中的方法

    -(void)sendData:(NSString *)str

    {

    self.label.text = str;

    }

    ......

    @end

    d.设置委托方(页面二)的代理为代理方(页面一)

    -(void)doJump
    {
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        //设置代理为页面一
        secondVC.delegate = self;
        [self presentViewController:secondVC animated:YES completion:nil];
    }

    以上是自己总结的一些关于IOS页面传值的方式,如有其它更好的方式,欢迎提出,谢谢

    相关文章

      网友评论

          本文标题:IOS界面传值的几种方式

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