03小码哥通讯录(数据存储)
// // XMGContact.m // 小码哥通讯录 #import "XMGContact.h" @implementation XMGContact static NSString *nameKey = @"name"; static NSString *phoneKey = @"phone"; - (void)encodeWithCoder:(NSCoder *)aCoder { // name.phone [aCoder encodeObject:_name forKey:nameKey]; [aCoder encodeObject:_phone forKey:phoneKey]; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super init]) { _name = [aDecoder decodeObjectForKey:nameKey]; _phone = [aDecoder decodeObjectForKey:phoneKey]; } return self; } + (instancetype)contactWithName:(NSString *)name phone:(NSString *)phone { XMGContact *c = [[self alloc] init]; c.name = name; c.phone = phone; return c; } @end
// XMGContactViewController.m // 小码哥通讯录 #import "XMGContactViewController.h" #import "XMGAddViewController.h" #import "XMGEditViewController.h" #import "XMGContact.h" #define XMGFilePath [ NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contacts.data"] @interface XMGContactViewController ()<UIActionSheetDelegate> @property (nonatomic, strong) NSMutableArray *contacts; @end @implementation XMGContactViewController - (NSMutableArray *)contacts { if (_contacts == nil) { // 读取数据 接档接档接档 _contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:XMGFilePath]; // 判断下有没有读取数据 if (_contacts == nil) { _contacts = [NSMutableArray array]; } } return _contacts; } // 跳转之前的时候调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { // 给添加控制器传递联系人控制器属性 XMGAddViewController *addVc = segue.destinationViewController; addVc.block = ^(XMGContact *contact){ // 1.联系人添加到数组 [self.contacts addObject:contact]; // 2.刷新表格 [self.tableView reloadData]; // 3.保存联系人,注意:如果归档数组,底层会遍历数组元素一个一个归档 [NSKeyedArchiver archiveRootObject:self.contacts toFile:XMGFilePath]; }; } // 点击注销的时候调用 - (IBAction)logout:(id)sender { // 弹出actionSheet UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"是否注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"注销" otherButtonTitles:nil, nil]; [sheet showInView:self.view]; } #pragma mark - UIActionSheetDelegate // 点击UIActionSheet控件上的按钮调用 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex { if (buttonIndex == 0) { // 点击了注销 [self.navigationController popViewControllerAnimated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // // 取消分割线 self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; // tableView有数据的时候才需要分割线 // 开发小技巧:快速取消分割线 self.tableView.tableFooterView = [[UIView alloc] init]; } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.contacts.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // 创建标示符 static NSString *ID = @"cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID]; } // 获取模型 XMGContact *c = self.contacts[indexPath.row]; cell.textLabel.text = c.name; cell.detailTextLabel.text = c.phone; return cell; } #pragma mark - tableView代理方法 // 点击cell的时候调用 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { // 加载storyboard UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; // 创建编辑控制器 XMGEditViewController *editVc = [storyboard instantiateViewControllerWithIdentifier:@"edit"]; editVc.contact = self.contacts[indexPath.row]; // block:点击编辑的时候调用这个block editVc.block = ^(){ // 刷新表格 [self.tableView reloadData]; // 3.保存联系人,注意:如果归档数组,底层会遍历数组元素一个一个归档 [NSKeyedArchiver archiveRootObject:self.contacts toFile:XMGFilePath]; }; // 跳转到编辑界面 [self.navigationController pushViewController:editVc animated:YES]; } // 只要实现这个方法,就会有滑动删除功能 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { // 删除模型 [self.contacts removeObjectAtIndex:indexPath.row]; // 删除tableViewCell [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } - (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewRowAction *action = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"增加" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { // 点击增加的时候调用 NSLog(@"增加"); }]; action.backgroundColor = [UIColor greenColor]; UITableViewRowAction *action1 = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) { // 点击增加的时候调用 NSLog(@"删除"); }]; return @[action,action1]; } @end
// // XMGLoginViewController.m // 小码哥通讯录 // // Created by xiaomage on 15/6/12. // Copyright (c) 2015年 xiaomage. All rights reserved. // #import "XMGLoginViewController.h" #import "MBProgressHUD+XMG.h" @interface XMGLoginViewController ()<UITextFieldDelegate> @property (weak, nonatomic) IBOutlet UIButton *loginBtn; @property (weak, nonatomic) IBOutlet UITextField *accountField; @property (weak, nonatomic) IBOutlet UITextField *pwdField; @property (weak, nonatomic) IBOutlet UISwitch *rmbPwdSwitch; @property (weak, nonatomic) IBOutlet UISwitch *autoLoginSwitch; @end /* 来源控制器传递给目的控制器:顺传 数据传值: 1.接收方一定要有属性接收 2.传递方必须要拿到接收方 */ /* 1.[self performSegueWithIdentifier] 2.创建segue 3.设置来源控制器segue.sourceViewController = self 4.创建目的控制器,segue.destinationViewController = 目的控制器 5.[self prepareForSegue]跳转之前的准备操作 6.[segue perform] 7.判断下segue的类型,如果是push,拿到导航控制器push [self.navigationController pushViewController:segue.destinationViewController animated:YES]; */ @implementation XMGLoginViewController #define XMGUserDefaults [NSUserDefaults standardUserDefaults] static NSString *accountKey = @"account"; static NSString *pwdKey = @"pwd"; static NSString *rmbKey = @"rmd"; static NSString *loginKey = @"login"; // 在执行跳转之前的时候调用 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { UIViewController *vc = segue.destinationViewController; vc.title = [NSString stringWithFormat:@"%@的联系人列表", _accountField.text]; NSLog(@"%@--%@",segue.sourceViewController,segue.destinationViewController); } // 点击了登录按钮的时候调用 // xmg 123 - (IBAction)login:(id)sender { // 提示用户,正在登录ing... [MBProgressHUD showMessage:@"正在登录ing..."]; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 隐藏蒙版 [MBProgressHUD hideHUD]; // 验证下账号和密码是否正确 if ([_accountField.text isEqualToString:@"xmg"] && [_pwdField.text isEqualToString:@"123"]) { // 输入正确 // 数据存储 // 账号,密码,记住密码,自动登录 [XMGUserDefaults setObject:_accountField.text forKey:accountKey]; [XMGUserDefaults setObject:_pwdField.text forKey:pwdKey]; [XMGUserDefaults setBool:_rmbPwdSwitch.on forKey:rmbKey]; [XMGUserDefaults setBool:_autoLoginSwitch.on forKey:loginKey]; // 直接跳转 // 跳转到联系人界面 [self performSegueWithIdentifier:@"login2Contact" sender:nil]; }else{ // 账号或者密码错误 // 提示用户账号或者密码错误 [MBProgressHUD showError:@"账号或者密码错误"]; } }); } // 记住密码开关状态改变的时候调用 - (IBAction)rmbPwdChange:(id)sender { // 如果取消记住密码,自动登录也需要取消勾选 if (_rmbPwdSwitch.on == NO) { // 取消记住密码 // 取消自动登录 [_autoLoginSwitch setOn:NO animated:YES]; } } // 自动登录开关状态改变的时候调用 - (IBAction)autoLoginChange:(id)sender { // 如果勾选了自动登录,记住密码也要勾选 if (_autoLoginSwitch.on == YES) { [_rmbPwdSwitch setOn:YES animated:YES]; } } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. // 读取数据 NSString *account = [XMGUserDefaults objectForKey:accountKey]; NSString *pwd = [XMGUserDefaults objectForKey:pwdKey]; BOOL rmb = [XMGUserDefaults boolForKey:rmbKey]; BOOL login = [XMGUserDefaults boolForKey:loginKey]; _accountField.text = account; if (rmb == YES) { _pwdField.text = pwd; } _rmbPwdSwitch.on = rmb; _autoLoginSwitch.on = login; // 勾选自动登录 if (login == YES) { [self login:nil]; } // 给文本框添加监听器,及时监听文本框内容的改变 [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged]; // 判断下登录按钮能否点击 [self textChange]; } // 任一一个文本框的内容改变都会调用 - (void)textChange { _loginBtn.enabled = _accountField.text.length && _pwdField.text.length; NSLog(@"%@--%@",_accountField.text,_pwdField.text); } @end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji