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开发的 ...
随机推荐
- [saiku] JCR在saiku中的运用原理
转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...
- lambda表達式
lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定 ...
- Objective-C:Foundation框架-常用类-NSNull
集合中是不能存储nil值的,因为nil在集合中有特殊含义,但有时确实需要存储一个表示“什么都没有”的值,那么可以使用NSNull,它也是NSObject的一个子类. #import <Found ...
- uva 1220
1220 - Party at Hali-Bula Time limit: 3.000 seconds Dear Contestant, I'm going to have a party at my ...
- 网站开发中必备的8个 jQuery 效果【附源码】
jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 JavaScript 的方式.它简化了 HTML 文档遍历,事件处理,动画和 Ajax 交互,而且有成千上万的成熟 jQuer ...
- 如何在win7下配置IIS?
- PDF 补丁丁 0.4.1 版将增加嵌入中文字库的功能
有不少用户反映,部分老 PDF 文件由于在制作时没有嵌入字库,导致该文件在某些阅读器上显示为乱码.即使他们用 Acrobat 嵌入了相应的字库,文件仍然无法正确显示. 这些老 PDF 看起来具有如下相 ...
- ANGULARJS 出错解决
先上代码 程序的意思是使用eval更改指令父scope的数据,在调用$digest 这样就出错了,出错信息如下: 解决办法: 增加timeout事件,具体原因还不是很清楚,反正问题目前是解决了.
- 使用Camera进行拍照
Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤如下: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照 ...
- 什么是RAID
RAID 维基百科,自由的百科全书 关于与「 RAID 」同名的其他主题,详见「 RAID (消歧义) 」. 独立硬盘冗余阵列 ( RAID , R edundant A rray of I ndep ...