2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据
一:登陆界面
1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下:
if ([acount isEqualToString:@"zhangsan"]&&[password isEqualToString:@""]) {
[self performSegueWithIdentifier:@"ContactsViewController" sender:nil];
[MBProgressHUD showSuccess:@"登陆成功"];
// 在用户登录成功后,读取此时的开关信息,并根据情况将用户的账号或者密码存放在沙盒里
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:self.acountField.text forKey:accountKey];
if (self.remerberSwitch.on) {
[defaults setObject:self.passwordField.text forKey:passwordKey];
}
[defaults synchronize];
}else{
[MBProgressHUD showError:@"账号密码错误"];
}
2):在viewDidLoad方法中判断此时开关情况,选择是否自动填充密码或者自动登陆,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.loginBtn.enabled = NO;
// 从沙盒中读取用户关于开关的偏好设置
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
self.loginSwitch.on = [defaults boolForKey:autoLoginSwitchForKey];
self.remerberSwitch.on = [defaults boolForKey:rememberPwdSwitchForKey];
// 根据已经读取到得开关的情况 从沙盒里读取用户账户或者密码
self.acountField.text = [defaults objectForKey:accountKey];
if (self.remerberSwitch.on) {
self.passwordField.text = [defaults objectForKey:passwordKey];
}
[self textChange];
// 判断自动登陆的开关是否打开,并自动登陆
// if (self.loginSwitch.on) {
// dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// [self loginBtnClicked];
// });
// }
3):
- (IBAction)rememberSwitchChange {
// 如果此时自动登陆开启,而记住密码为关闭,应该关闭自动登录
if (self.loginSwitch.isOn == YES && self.remerberSwitch.isOn == NO) {
[self.loginSwitch setOn:NO animated:YES];
}
// 保存开关数据到沙盒里去
NSUserDefaults *defautls = [NSUserDefaults standardUserDefaults];
[defautls setBool:self.remerberSwitch.on forKey:rememberPwdSwitchForKey];
[defautls setBool:self.loginSwitch.on forKey:autoLoginSwitchForKey];
[defautls synchronize];
}
- (IBAction)autoLoginSwitchChange {
//如果此时自动登陆开启,而记住密码为关闭,则应该打开记住密码
if (self.remerberSwitch.isOn == NO && self.loginSwitch.isOn == YES) {
[self.remerberSwitch setOn:YES animated:YES];
}
NSUserDefaults *defautls = [NSUserDefaults standardUserDefaults];
[defautls setBool:self.remerberSwitch.on forKey:rememberPwdSwitchForKey];
[defautls setBool:self.loginSwitch.on forKey:autoLoginSwitchForKey];
[defautls synchronize];
}
二:contactsViewController中
1);
//定义一个文件路径
@property (copy, nonatomic) NSString *contactPath;
同时设置文件路径属性懒加载和数据模型数组懒加载
// 懒加载联系人的文件路径
- (NSString *)contactPath
{
if (!_contactPath) {
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
_contactPath = [doc stringByAppendingPathComponent:@"contacts.acrhiver"];
}
return _contactPath;
}
- (NSMutableArray *)contacts
{
if (!_contacts) {
// 先从沙盒中获取数据
_contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:self.contactPath];
// NSLog(@"%d",self.contacts.count);
// 0x7fe0085f94a0
// 0x7ff800fb3c40
if (!_contacts) {
NSMutableArray *contacts = [NSMutableArray array];
_contacts = contacts;
}
}
return _contacts;
}
2):在addcontactViewcontroller与edicontactViewController的代理方法中同时添加如下代码:
// 同步数据到沙盒里去
[NSKeyedArchiver archiveRootObject:self.contacts toFile:self.contactPath];
三:实际效果:

2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据的更多相关文章
- 2016-1-5第一个完整APP 私人通讯录的实现 1:登录界面及跳转的简单实现2
---恢复内容开始--- 实际效果如上 一:Segue的学习 1.什么是Segue: Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue) ...
- 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能
一:在viewDidLoad方法中代码添加一个UIBarButtonItem,并将其的类型设置成垃圾桶,代码如下: - (void)viewDidLoad { [super viewDidLoad]; ...
- 2016-1-6第一个完整APP 私人通讯录的实现 4:编辑联系人
一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h& ...
- 2016-1-6第一个完整APP 私人通讯录的实现 3:添加联系人
一:创建模型对象:contact用于存放数据,也便于读取加载 #import <Foundation/Foundation.h> @interface contact : NSObject ...
- 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框
一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...
- (三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线
项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告. 细节1:跳转的数据传递. prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般 ...
- App在后台运行时如何保存数据到sqlite数据库
iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中的数据. 因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存 ...
- iOS完整App资源收集
前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 本篇文章持续更新中,请持续关注.本篇所收集的 ...
- MUI框架开发HTML5手机APP(一)--搭建第一个手机APP
前 言 JRedu 随着HTML5的不断发展,移动开发成为主流趋势!越来越多的公司开始选择使用HTML5开发手机APP,而随着手机硬件设备配置的不断提升,各种开发框架的不断优化,也使着H5开发的 ...
随机推荐
- Mongoose学习参考文档
一.快速通道 1.1 名词解释 Schema : 一种以文件形式存储的数据库模型骨架,不具备数据库的操作能力 Model : 由Schema发布生成的模型,具有抽象属性和行为的数据库操作对 Entit ...
- Java中print、printf、println
Java中的System.out输出会用到print.println以及printf命令. 其中 print一般的标准输出,但是不换行. println对比print即在结尾处多了换行. eg:pr ...
- 琐碎的总结 css jQuery js 等等。。。
jQuery outerWidth(true)支持ie7 不错不错css BFC a {display:inline-block} 有用,block不是很有效果 ...
- FireFox背景亮度修改
安装stylish 输入:body{filter: brightness(80%);}
- Qt之属性系统
简述 Qt提供一个类似于其它编译器供应商提供的复杂属性系统(Property System).然而,作为一个编译器和平台无关的库,Qt不能够依赖于那些非标准的编译器特性,比如:__property或者 ...
- zoj3822 Domination(概率dp)
Domination Time Limit: 8 Seconds Memory Limit: 131072 KB Special Judge Edward is the headm ...
- hdu----(3118)Arbiter(构造二分图)
Arbiter Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total S ...
- Icon资源详解[1]
本文分享&备忘最近了解到的icon资源在windows平台下相关的一部分知识,所有测试代码都尽可能的依赖win32 API实现.更全面的知识,参考文末列出的”参考资料“. 关键字:I ...
- Apache—DBUtils框架简介
转载自:http://blog.csdn.net/fengdongkun/article/details/8236216 Apache—DBUtils框架简介.DbUtils类.QueryRunner ...
- Redis系列-存储篇sorted set主要操作函数小结
redis支持有序集合,即sorted set.sorted set在set的基础上,增加了排序属性,是set的升级版.这里简要谈谈sorted set的常用函数: 1)insert a) zadd ...