一:登陆界面

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:保存数据的更多相关文章

  1. 2016-1-5第一个完整APP 私人通讯录的实现 1:登录界面及跳转的简单实现2

    ---恢复内容开始--- 实际效果如上 一:Segue的学习 1.什么是Segue: Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)   ...

  2. 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能

    一:在viewDidLoad方法中代码添加一个UIBarButtonItem,并将其的类型设置成垃圾桶,代码如下: - (void)viewDidLoad { [super viewDidLoad]; ...

  3. 2016-1-6第一个完整APP 私人通讯录的实现 4:编辑联系人

    一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h& ...

  4. 2016-1-6第一个完整APP 私人通讯录的实现 3:添加联系人

    一:创建模型对象:contact用于存放数据,也便于读取加载 #import <Foundation/Foundation.h> @interface contact : NSObject ...

  5. 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框

    一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...

  6. (三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线

    项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告. 细节1:跳转的数据传递. prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般 ...

  7. App在后台运行时如何保存数据到sqlite数据库

    iOS程序进入后台后,是不允许读写任何文件和数据库(sqlite),但是允许读写NSUserDefault中的数据. 因此在后台时如果想存储数据,则可使用NSUserDefault(偏好设置)临时保存 ...

  8. iOS完整App资源收集

    前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 本篇文章持续更新中,请持续关注.本篇所收集的 ...

  9. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP

      前  言 JRedu 随着HTML5的不断发展,移动开发成为主流趋势!越来越多的公司开始选择使用HTML5开发手机APP,而随着手机硬件设备配置的不断提升,各种开发框架的不断优化,也使着H5开发的 ...

随机推荐

  1. [saiku] JCR在saiku中的运用原理

    转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...

  2. lambda表達式

    lambda简介 lambda运算符:所有的lambda表达式都是用新的lambda运算符 " => ",可以叫他,“转到”或者 “成为”.运算符将表达式分为两部分,左边指定 ...

  3. Objective-C:Foundation框架-常用类-NSNull

    集合中是不能存储nil值的,因为nil在集合中有特殊含义,但有时确实需要存储一个表示“什么都没有”的值,那么可以使用NSNull,它也是NSObject的一个子类. #import <Found ...

  4. uva 1220

    1220 - Party at Hali-Bula Time limit: 3.000 seconds Dear Contestant, I'm going to have a party at my ...

  5. 网站开发中必备的8个 jQuery 效果【附源码】

    jQuery 作为最优秀 JavaScript 库之一,改变了很多人编写 JavaScript 的方式.它简化了 HTML 文档遍历,事件处理,动画和 Ajax 交互,而且有成千上万的成熟 jQuer ...

  6. 如何在win7下配置IIS?

  7. PDF 补丁丁 0.4.1 版将增加嵌入中文字库的功能

    有不少用户反映,部分老 PDF 文件由于在制作时没有嵌入字库,导致该文件在某些阅读器上显示为乱码.即使他们用 Acrobat 嵌入了相应的字库,文件仍然无法正确显示. 这些老 PDF 看起来具有如下相 ...

  8. ANGULARJS 出错解决

    先上代码 程序的意思是使用eval更改指令父scope的数据,在调用$digest 这样就出错了,出错信息如下: 解决办法: 增加timeout事件,具体原因还不是很清楚,反正问题目前是解决了.

  9. 使用Camera进行拍照

    Android应用提供了Camera来控制拍照,使用Camera进行拍照的步骤如下: 1.调用Camera的open()方法打开相机. 2.调用Camera的getParameters()方法获取拍照 ...

  10. 什么是RAID

    RAID 维基百科,自由的百科全书 关于与「 RAID 」同名的其他主题,详见「 RAID (消歧义) 」. 独立硬盘冗余阵列 ( RAID , R edundant A rray of I ndep ...