【案列】私人通讯录02 - 数据存储和删除

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

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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值