设为首页 加入收藏

TOP

iOS学习——页面的传值方式(五)
2019-08-26 07:01:36 】 浏览:122
Tags:iOS 学习 面的 方式
}
//接收通知,解析内容进行处理 - (void)notiReceived:(NSNotification *)sender { self.textField.text = sender.userInfo[@"content"]; } - (void) btnClicked:(UIButton *)btn { [self.navigationController popViewControllerAnimated:YES]; } @end

2.5 NSUserDefaults传值

方法描述:NSUserDefaults传值是将所要传的值写在沙盒目录里面,需要获取值的时候直接访问沙盒,获取这个值就可以了,这种传值方法一般用在需要将数据本地存储的时候,比如:用户名之类,当用户下次登录或者使用app的时候,可以直接从本地读取。

适用场景:任何需要数据传递的场景都适用,但是传递数据的类型仅限于基本数据类型,不能用于自定义的对象类型。

传递方式:正向传值、反向传值。

使用步骤

  1. 需要传值时将数据通过NSUserDefaults保存到沙盒目录里面
    - (void) btnClicked:(UIButton *)btn {
        /*
         setObject:后面写的就是所需要传递的值
         forKey:要具有唯一性、一致性;
         唯一性是指:当代码中用到多个NSUserDefaults方法时,要保证不同的key不一样,否则就是覆盖值
         一致性:这里传递一个值,当需要用到的时候,要用valueForkey的方法,这个key和传值时候写的key要一样,写错了就找不到值了。
         */
        [[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults传值" forKey:@"NSUserDefaults"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        
        [self.navigationController popViewControllerAnimated:YES];
    }
  2. 需要使用值时通过NSUserDefaults从沙盒目录里面取值进行处理
    _label.text = [[NSUserDefaults standardUserDefaults] valueForKey:@"NSUserDefaults"];

2.6 单例传值

方法描述:单例传值的性质和NSUserDefaults传值的性质类似,只是单例传值是将数据保存在单例对象中,需要的时候同样从单例对象中去获取数据使用就ok。

适用场景:任何需要数据传递的场景都适用,传递的数据可以是任何类型的数据。

传递方式:正向传值、反向传值均OK。

使用步骤

  1. 创建一个类,拥有一些属性用于保存数据,并实现单例方法
    @interface KLDanliObj : NSObject
    
    @property (nonatomic, copy) NSString *content; //保存数据数据的属性
    
    + (instancetype) shardDanLiObj; //单例对象获取方法
    
    @end
    #import "KLDanliObj.h"
    
    static DanLi *danli = nil;
    
    @implementation KLDanliObj
    
    + (instancetype) shardDanLiObj {
        //实现方法,判断是否为空,是就创建一个全局实例给它
        if (danli == nil) {
            danli = [[KLDanliObj alloc] init];
        }
        return danli;
    }
    
    @end
  2. 需要传递数据时使用单例类将数据保存到单例的属性中
    [KLDanliObj shardDanLiObj].content = @"主界面传递的数据"; 
  3. 需要使用值时通过单例的属性获取数据进行使用和处理
    self.textField.text = [KLDanliObj shardDanLiObj].content; 

2.7 KVC传值

方法描述:KVC(Key-value coding)键值编码,单看这个名字可能不太好理解。其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值,而不需要调用明确的存取方法,这样就可以在运行时动态地访问和修改对象的属性。这其实和属性传值比较类似。

适用场景:当从主页面push到子页面时,子页面需要使用到主页面的数据,我们需要使用到正向传值。

传递方式:正向传值

使用步骤

  1. 在需要传值时使用KVC给子页面的属性进行赋值就ok了
    - (void) btnClicked:(UIButton *)btn {
        KLSubViewController *subVC = [[KLSubViewController alloc] init];
        //给子页面subVC的属性content赋值 和subVC.content = @"主页面传递的数据";效果一样
        [subVC setValue:@"主页面传递的数据" forKey:@"content"];
        [self.navigationController pushViewController:subVC animated:YES];
    } 

2.8 KVO传值

方法描述:KVO(Key-Value-Observing,键值观察),即观察关键字的值的变化。首先在子页面中声明一个待观察的属性,在返回主页面之前修改该属性的值。在主页面中提前分配并初始化子页面,并且注册对子页面中对应属性的观察者。在从子页面返回上主之前,通过修改观察者属性的值,在主页面中就能自动检测到这个改变,从而读取子页面的数据。

适用场景:已经通过push的方式进入到子页面,在从子页面返回主页面的时候(子页面会释放掉内存),需要在主页面中使用子页面中的数据,这是就可以利用代理反向传值。

传递方式:反向传递。

使用步骤

  1. 在主页面注册观察者,实现KVO的回调方法,并在主页面销毁时移除观察者
    @interface KLMainViewController ()
    
    @property (strong, nonatomic) UITextField *textField;
    @property (strong, nonatomic) UIButton *button;
    
    @property (strong, nonatomic) KLSubViewController *subVC;
    
    @end
    
    @implementation KLMainViewController
    
    - (void)dealloc {
        //移除观察者
        [self.subVC removeObserver:self forKeyPath:@"content"];
    }
    
    - (vo
首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇IOS马甲包(诚招大量开发) 下一篇block本质探寻六之修改变量

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目