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];
}
本文介绍了一种利用偏好设置存储用户名、密码,并实现自动登录功能的方法。同时,通过遵守NSCoding协议来归档存储联系人模型,包括在添加、编辑联系人后进行归档操作,以及提供滑动删除功能的实现细节。

被折叠的 条评论
为什么被折叠?



