【iOS学习】九、数据获取与界面跳转传值

一、需要完成的任务

在界面一定义一个登录界面,将登陆信息存到NSUserDefault中。

在界面二自定义一个pickerview,调用接口获取pickerview的数据源;定义一个label,label.text根据pickerview选择的值从接口获取。

在界面三中定义两个label,它们的值分别从NSUserDefault中获取和从界面二的label.text传过来。

二、NSUserDefault的使用

1、作用:NSUserDefaults类提供了一个与默认系统进行交互的编程接口。NSUserDefaults对象是用来保存,恢复应用程序相关的偏好设置,配置数据等等。默认系统允许应用程序自定义它的行为去迎合用户的喜好。你可以在程序运行的时候从用户默认的数据库中读取程序的设置。同时NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步。

2、原理:NsUserDefault是用户轻量级的数据持久化,主要用于保存用户程序的配置等信息,以便下次启动程序后能恢复上次的设置。因为是写到了硬盘上,所以会出现用多了会造成系统浪费,内存占用过大等问题。

(1)该数据实际上是以“键值对”形式保存的(类似于NSDictionary),因此我们需要通过key来读取或者保存数据(value)。

(2)NSUserDefaults类提供了非常方便的方法来获取常用的类型,例如floats,doubles,intergers,Booleans,URLs。所以这也就是说我们可以存储NSData,NSString,NSNUmber,NSDate,NSArray,NSDictionary(目前有五种类型)这些实例。如果你想存储其他类型的对象,你要将其归档并创建一个NSData来实现存储。

(3)从NSUserDefaults返回的值是不可改变的,即便是你在存储的时候使用的是可变的值。例如你使用mutable string做为“MyStringDefault”的值,当你做使用stringForKey:方法获取的值,这个值仍然是不可变的。

(4)NSUserDefaults是单例,同时也是线程安全的

3、语法:

存储整型的例子:

(1)获取一个NSUserDefaults引用:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

(2)保存数据

[userDefaults setInteger:1 forKey:@"segment"];
[userDefaults synchronize];

(3)读取数据

int i = [userDefaults integerForKey:@"segment"];

存储其他数据类型的例子:

(1)保存数据:保存UIcolor类型的,超出上面的5种数据类型,就要进行归档,把它们归档成data类型的数据之后再保存。

NSData *objColor = [NSKeyedArchiver archivedDataWithRootObject:[UIColor redColor]];

[[NSUserDefaults standardUserDefaults]setObject:objColor forKey:@"myColor"];

(2)读取数据:

NSData *objColor = [[NSUserDefaults standardUserDefaults]objectForKey:@"myColor"];

UIColor *myColor = [NSKeyedUnarchiver unarchiveObjectWithData:objColor];

4、NSUserDefault的使用小技巧:

(1)NSUserDefault保存的数据在程序没有关闭前能成功读取到,但是当应用程序重启之后,就无法读取到,原因就是数据没有即时写入。通过官方文档可以了解到,UserDefaults是根据时间戳定时的把缓存中的数据写入本地磁盘,而非即时写入。所以调用set方法之后数据有可能还没有写入磁盘,应用程序就已经终止了。保险期间,我们在对重要的数据保存时使用synchornize方法强制写入。但是也要注意,不用频繁的使用synchornize。

(2)在使用NSUserDefault的时候,很多人以为:

[[NSUserDefaults standardUserDefaults] setObject:array forKey:@”testInfo”] ;

后就已经算存储好了,再通过

[[NSUserDefaults standardUserDefaults] objectForKey:@”testInfo”];

就可以取出刚刚存的数据。
其实正常情况下没有问题,但是当重起程序,关键字testInfo对应的竟然是空,这是什么情况呢??

我们看看NSUserDefaults的头文件,就会发现,其实还有另外一个方法:synchronize,数据即时写入。

如果我们在set后,执行下面的语句:

[[NSUserDefaults standardUserDefaults] synchronize];

那么就不会出现上面的取出数据为空的情况了。

完整代码如下:

//存入数据

NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];

[defaults setObject:@”111” forKey:@”t

est”];

//把数据写到硬盘上

[defaults synchronize];

//取出数据

NSString *testStr =[defaults objectForKey:@”test”];

NSLog(@”testStr is: %@”,testStr);

三、从接口获取数据

// 将获取到的数组作为pickerview的数据源。
NSData *data = [RequestMaker GetColumnsBysynchronization];
    self.columnsArray = [Utility ParseColumnsFromData:data];
// 根据用户在pickerview中选择的数据,得到制片人
NSData *producerData = [RequestMaker GetUserByColumnProducer:_producerPickerview.SelectedTitle];
        _showProducer.text = [Utility ParseProducerStringFromColumnProducerData:producerData];

四、界面跳转传值

// 将两个页面间要传的值设置为全局变量
// 在声明页面到push之间传值
        baoboTestViewController *bbView = [[baoboTestViewController alloc]init];
        // 将标签的text传到下一个页面
        bbView.producerNameStr = _showProducer.text;
        [self.navigationController pushViewController:bbView animated:NO];
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值