一:登陆界面

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. android:layout_weight的真实含义

    首先声明只有在Linearlayout中,该属性才有效.之所以android:layout_weight会引起争议, 是因为在设置该属性的同时,设置android:layout_width为wrap_ ...

  2. Columbia遗留问题

    本来Columbia只是按照顺序,导航不可以点击,数组按照顺序push的小东西 在leader的要求下,要变成导航可以点击,无顺序的一团浆糊,经过了大概长达两天(我是不是太适合做程序!)的反复纠结,浆 ...

  3. (11)odoo权限机制

    -----------------更新时间:10:21 2016-09-29 星期四14:31 2016-09-28 星期三 权限对象命名修改18:06 2016-09-18 星期日11:55 201 ...

  4. springMVC 验证器

    采用Hibernate-validator来进行验证,Hibernate-validator实现了JSR-303验证框架支持注解风格的验证.首先我们要到http://hibernate.org/val ...

  5. 《算法导论》笔记---附录 B.5 树

    遇到同样的问题,在豆瓣上转过来记录下. 以下内容转自:http://book.douban.com/annotation/16409380/ -------------------分割线------- ...

  6. Iterator之ListIterator简介

    ListIterator是什么? (参考自百度百科) java中的ListIterator在Iterator基础上提供了add.set.previous等对列表的操作.但是ListIterator跟I ...

  7. Android窃取用户信息新思路

    0×01 我们能得到哪些android手机上的app敏感信息手机上的app敏感信息◦通讯录,通讯记录,短信◦各种app的帐号密码,输入信息资料等◦各种影音资料,照片资料◦等等0×02  我们有哪些方法 ...

  8. iScroll 优化

    iScroll 它比较好的解决了移动互联网 web app 滚动支持问题以及点击事件缓慢的问题,经过简单配置即可让 web app 像原生 app 一样流畅,甚至都不需要改变原来的编码方式,目前它几乎 ...

  9. 利用K2和Microsoft Dynamics CRM构建业务App的5大理由

    Microsoft Dynamics CRM提供了一个绝佳的客户关系管理平台,使您能够创建各种以客户为中心的解决方案.然而,通过将K2的企业业务流程功能与Microsoft Dynamics CRM相 ...

  10. 经典线程同步 事件Event

    阅读本篇之前推荐阅读以下姊妹篇: <秒杀多线程第四篇 一个经典的多线程同步问题> <秒杀多线程第五篇 经典线程同步关键段CS> 上一篇中使用关键段来解决经典的多线程同步互斥问题 ...