UI界面
-(void)viewDidLoad
{
[super viewDidLoad];
//addTarget:一般用于监听按钮的点击 以及进度条值的改变
//通过通知监听UITextField的改变
/*
addObserver:谁来监听
selector:通知发生的时候调用什么方法
name:通知名称
object:谁发送的通知
注意:object不能写nil,因为如果是nil只要是UITextField发生改变都会调用textChange方法,而我们只在账号和密码输入框发生改变的时候才调用
*/
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameField];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.pwdField];
//读取偏好设置信息
NSUuserDefualts *defualts = [NSUuserDefualts standardUserDefualts];
//读取账号信息
self.nameField.text = [defualts obejctForKey:kAccount];
是否需要保存密码
self.remPwd.on =[defualts boolForKey:kRemPwd];
if(self.remPwd.on){ //需要记住密码
self.PwdField.text = [defualts objectForKey:kPassword];
}
是否需要自动登陆
self.autoLogin.on =[defualts boolForKey:kAutoLogin];
if(self.autoLogin.on){ //需要自动登陆
//手动点击登陆按钮
[self logBtnClick];
}
}
// 移除监听
-(void)dealloc
{...}
/**
* 输入框发生改变的时候调用
*/
-(void)textChange
{...}
#pragma mark - 按钮点击事件
/**
* 点击记住密码
*/
-(IBAction)remPwdSwitch
{
//判断记住密码开关的状态
if(self.remPwd.on == NO){
//取消了记住密码,对应取消自动登陆
//self.autoLogin.on = NO;
[self.autoLogin setOn:NO animated:YES];
}
}
/**
* 点击自动登陆
*/
-(IBAction)autoLoginSwitch
{...}
/**
* 点击登陆按钮
* iOS开发常用框架
* coco4app
*/
-(IBAction)logBtnClick
{
//判断用户名和密码是否正确
if(self.nameField.text isEqualToString:@"lnj")&&
[self.pwdField.text isEqualToString:@"123"]){
//显示蒙版(挡住不让用户继续操作,以及提示用户)
[MBProgressHUD showMessage:@"正在拼命登陆ing....."];
//模拟网络登陆 2秒之后再跳转
dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(0.5 * NSEC_PER_SEC)),dispatch_get_main_queue(),^{
//移除提示框
[MBProgressHUD hideHUD];
//保存偏好设置信息
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//1.账号
[defaults setObject:self.nameField.text forKey:kAccount];
//2.密码
[defaults setObject:self.pwdField.text forKey:kPassword];
//3.是否自动登陆
[defaults setBool:self.autoLogin.on forKey:kAutoLogin];
//4.是否记住密码
[defaults setBool:self.remPwd.on forKey:@"kRemPwd"];
//立刻同步(立刻保存数据)
[defaults synchronize];
//跳转到联系人列表
[self
performSegueWithIdentifier:@"login2contacts"sender:@"lnj"];
});
}else
{
[MBProgressHUD showError:@"用户名或者密码错误"];
}
}
在NJContactsViewController.m中
-(void)logout
{...}
#pragma mark - UIActionSheetDelegate
//UIActionSheet上面的按钮被点击的时候调用
//buttonIndex被点击按钮的索引
-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{...}
//segue跳转之前调用
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{...}
#pragma mark - NJEditViewControllerDelegate
-(void)editViewController:(NJEditViewController *)editViewController didContact:(NJContact *)contact
{
//1.刷新表格
[self.tableView reloadData];
//2.持久化数据
[NSKeyedArchiver archiveRootObject:self.contacts toFile:kFilePath];
}
#pragma mark -NJAddViewControllerDelegate
-(void)addViewController:(NJAddViewController *)addViewController didContact:(NJContact *)contact
{
//1.保存数据
[self.contacts addObject:contact];
//2.刷新表格
[self.tableView reloadData];
//3.持久化模型数据(先要遵守NSCoding协议并实现协议方法)
[NSKeyedArchiver archiveRootObject:self.contacts toFile:kFilePath];
}
PS:将 [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)
lastObject ] stringByAppendingPathComponent:@"contacts.arc"];
定义成宏 kFilePath
编辑模式(在NJContactsViewController.m中)
//只要实现该方法,手指在cell上面滑动的时候就自动实行删除按钮
//commitEditingStyle:传入提交的编辑操作(删除/添加)
//forRowAtIndexPath:当前正在编辑的行
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:
(NSIndexPath *)indexPath
{
//1.修改数据
[self.contacts removeObjectAtIndex:indexPath.row];
//2.刷新表格
//reloadData会重新调用数据源的所有方法。刷新所有行
//该方法用于删除tableView上指定行的cell
//注意:使用该方法的时候,模型中删除的数据条数必须和deleteRowsAtIndexPaths方法中删除的条数一致,否则会报错
//简而言之,就修改的数据必须和删除的cell保持一致
[self.tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:随便选]
//3.更新保存的文件
[NSKeyedArchiver archiveRootObject:self.contacts toFile:kContactsPath];
}
#pragma mark - 懒加载
-(NSMutableArray *)contacts
{
if(_contacts == nil){
//从归档文件中读取数据
_contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:kFilePath];
if(_contacts == nil){ //没有归档文件的情况
_contacts = [NSMutableArray array];
}
}
return _contacts;
}