【案列】私人通讯录02 - 数据存储和删除
来源:互联网 发布:pcb画图软件 编辑:程序博客网 时间:2024/06/10 00:32
1.利用偏好设置,存储用户名,密码,记住密码,自动登录
登录操作中存储:
/** * 登录操作 */- (IBAction)loginBtnAction:(UIButton *)sender{ // 添加蒙版 [MBProgressHUD showMessage:@"正在登录..."]; // 模拟请求网络 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 隐藏蒙版 [MBProgressHUD hideHUD]; // 验证帐号密码 if ([self.accountField.text isEqualToString:@"name"] && [self.pwdField.text isEqualToString:@"123"]) { // 数据存储 // 帐号,密码,记住密码,自动登录 [[NSUserDefaults standardUserDefaults] setObject:_accountField.text forKey:@"account"]; [[NSUserDefaults standardUserDefaults] setObject:_pwdField.text forKey:@"pwd"]; [[NSUserDefaults standardUserDefaults] setBool:_rmbPwdSwitch.on forKey:@"rmb"]; [[NSUserDefaults standardUserDefaults] setBool:_autoLoginSwitch.on forKey:@"autoLogin"]; // 跳转到联系人界面 [self performSegueWithIdentifier:@"login2contact" sender:nil]; }else{ // 帐号或者密码错误 [MBProgressHUD showError:@"帐号或者密码错误"]; } });}登录控制器加载的时候读取:
- (void)viewDidLoad { [super viewDidLoad]; // 读取偏好设置数据 NSString *account = [[NSUserDefaults standardUserDefaults] objectForKey:@"account"]; NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"]; BOOL rmb = [[NSUserDefaults standardUserDefaults] boolForKey:@"rmb"]; BOOL autoLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"autoLogin"]; _accountField.text = account; if (rmb == YES) { _pwdField.text = pwd; } _rmbPwdSwitch.on = rmb; _autoLoginSwitch.on = autoLogin; if (autoLogin == YES) { [self loginBtnAction:nil]; } // 给文本框添加监听 [self.accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; [self.pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; // 判断登录按钮是否可以点击 [self textChange];}2.归档存储联系人模型
模型需要遵守NSCoding协议:
//// Contact.h#import <Foundation/Foundation.h>@interface Contact : NSObject <NSCoding>@property(nonatomic,strong)NSString *name;@property(nonatomic,strong)NSString *phone;/** * 快速返回一个联系人模型对象 */+ (instancetype)contactWithName:(NSString *)name phone:(NSString *)phone;@end并实现2个方法:
//// Contact.m#import "Contact.h"@implementation Contact+ (instancetype)contactWithName:(NSString *)name phone:(NSString *)phone{ Contact *c = [[self alloc] init]; c.name = name; c.phone = phone; return c;}// 遵守<NSCoding>协议必须实现下面2个方法/** * 归档 */- (void)encodeWithCoder:(NSCoder *)aCoder{ [aCoder encodeObject:_name forKey:@"name"]; [aCoder encodeObject:_phone forKey:@"phone"];}/** * 解档 */- (instancetype)initWithCoder:(NSCoder *)aDecoder{ if (self=[super init]) { _name = [aDecoder decodeObjectForKey:@"name"]; _phone = [aDecoder decodeObjectForKey:@"phone"]; } return self;}@end然后添加联系人后要归档,编辑后也要归档,因为他们都在联系人控制器里实现了相应的代理协议或block,所以归档工作我们可以写在联系人控制器里:
#define cachesFilePath [[NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingString:@"contacts.data"]
- (NSMutableArray *)contacts{ if (_contacts == nil) { // 读取本地数据 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:cachesFilePath]; // 判断有木有数据 if (_contacts == nil) { _contacts = [NSMutableArray array]; } } return _contacts;}
#pragma mark - AddViewControllerDelegate- (void)addViewController:(AddViewController *)addVC didClickAddBtnWithContact:(Contact *)contact{ // 把联系人模型保存到数组里面 [self.contacts addObject:contact]; // 刷新表格 [self.tableView reloadData]; // 保存联系人(归档) [NSKeyedArchiver archiveRootObject:self.contacts toFile:cachesFilePath];}
/** * 点击cell的时候调用 */- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ // 加载stroryborad(我们这里从storyboard创建控制器) UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // 创建编辑控制器 // "edit"标识符 在Main.storyboard EditViewController *edit = [sb instantiateViewControllerWithIdentifier:@"edit"]; edit.contact = self.contacts[indexPath.row]; // 设置block 要执行的 edit.block = ^(Contact *contact){ [self.contacts replaceObjectAtIndex:indexPath.row withObject:contact]; // 刷新表格 [self.tableView reloadData]; // 保存联系人(归档) [NSKeyedArchiver archiveRootObject:self.contacts toFile:cachesFilePath]; }; // 跳转到编辑界面 [self.navigationController pushViewController:edit animated:YES];}
3.删除联系人
/** * 只要实现了这个方法,就会滑动删除功能 */- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ // 删除模型 [self.contacts removeObjectAtIndex:indexPath.row]; // cell删除效果 [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];}
0 0
- 【案列】私人通讯录02 - 数据存储和删除
- 【案列】私人通讯录01
- 练习:私人通讯录(数据的归档解档和删除某一行)
- 私人通讯录
- 私人通讯录
- ios-day13-01(私人通讯录。控制器之间的数据传递、保存密码和自动登录的实现、普通对象的归档、UITableView的局部刷新和向左滑动删除功能等等)
- 数据列存储和行存储
- 练习:私人通讯录(界面和功能展示)
- 私人通讯录思路
- iOS私人通讯录
- No4 私人通讯录
- 小结:私人通讯录
- 小结:私人通讯录知识点
- 私人通讯录Demo - iOS
- HDFS数据存储和删除
- 数据存储的行存储和列存储
- iOS开发 - 第02篇 - UI进阶 - 08 - 私人通讯录
- 私人数据
- 【Scala-ML】如何利用Scala构建并行机器学习系统
- HDOJ 1280 前m大的数
- 第三周项目4—穷举法解决组合问题
- Java中Arraylist可以像链表一样不需初始声明大小而增长的原因
- 网络技术-android--20160317
- 【案列】私人通讯录02 - 数据存储和删除
- 【Scala-ML】使用Scala构建机器学习工作流
- 基础网络概念(鸟哥的私房菜)
- CentOS6.5中修改yum源
- 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
- Eclipse安装tomcat插件
- 快速排序算法
- Ajax状态码
- struts2上传文件(二) jsp上传文件