一:登陆界面

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. js节点问题

    转载 http://dwt1220.blog.51cto.com/1028523/745402 本文出自 “dwt1220” 博客,请务必保留此出处http://dwt1220.blog.51cto. ...

  2. robotframework笔记24

    侦听器接口 机器人框架有一个侦听器接口,可以用于接收 对测试执行通知. 示例用法包括 外部测试监控,测试失败时发送邮件消息, 与其他系统进行通信. 侦听器API版本3也使得 它可以修改测试在测试执行和 ...

  3. ARM指令集(上)

    ADuC702x可以用两套指令集:ARM指令集和Thumb指令集.本小节介绍ARM指令集.在介绍ARM指令集之前,先介绍指令的格式. A.2.1  指令格式         (1)基本格式       ...

  4. android.support.v4.app.Fragment和android.app.Fragment区别

    1.最低支持版本不同 android.app.Fragment 兼容的最低版本是android:minSdkVersion="11" 即3.0版 android.support.v ...

  5. mvc伪静态<四> 伪静态后静态页面或者引用的css和图片失效

    引用的css和图片失效的解决办法 把样式引用文件的相对路径改成绝对路径就可以了 比如原先的引用路径为:<link href="~/Content/css/style.css" ...

  6. #ifdef __cplusplus extern "C"

    #ifdef __cplusplus extern "C" { #endif //一段代码 #ifdef __cplusplus } #endif首先,__cplusplus是cp ...

  7. ios基础篇(一)——UIView控件基本属性与常见用法

    1.frame 控件的位置和尺寸(以父控件的左上角为坐标原点(0,0)) 2.center 控件的中点(以父控件的左上角为坐标原点) 3.bounds 控件的位置和尺寸(以自己的左上角为坐标原点(0, ...

  8. FZU 2027 单词问题 map标记字符串典型问题

    题目链接:单词问题 找一个字符串里的所有单词,重复的只输出一次.关于map函数key值是字符串的问题一直比较含糊... 挣扎了一番,大概是,map的key值是char型数组的时候,标记的是地址,于是有 ...

  9. 重点关注之OData with List

    OData是什么 官方解释:The Open Data Protocol (OData) is a data access protocol for the web. OData provides a ...

  10. PHPExcel 学习笔记

    首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...