模型文件Contact.h
#import <Foundation/Foundation.h>
@interface Contact : NSObject <NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *mobile;
@end
Contact.m
#import "Contact.h"
/**
* 自定义的模型如何写入文件?!
通过NSKeyedArchiver
遵循NSCoding协议
两个方法:
1.encodeWithCoder:将一个对象转换成特定的数据流;
2.initWithCoder:讲一个文件转换成特定的对象;
*/
@implementation Contact
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
_name = [aDecoder decodeObjectForKey:@"name"];
_mobile = [aDecoder decodeObjectForKey:@"mobile"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_mobile forKey:@"mobile"];
}
@end
AddContactViewController.h
#import <UIKit/UIKit.h>
#import "Contact.h"
@protocol AddContactViewControllerDelegate <NSObject>
@optional
//添加联系人:
- (void)onAddContact:(Contact *)contact;
//取消添加联系人:
- (void)onCancel;
@end
@interface AddContactViewController : UIViewController
@property (nonatomic, assign) id<AddContactViewControllerDelegate> delegate;
@end
AddContactViewController.m
#import "AddContactViewController.h"
@interface AddContactViewController ()
//用户名输入框:
@property (weak, nonatomic) IBOutlet UITextField *userNameTextField;
//手机号输入框:
@property (weak, nonatomic) IBOutlet UITextField *mobileTextField;
@end
@implementation AddContactViewController
#pragma mark - Life Cycle
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = @"添加联系人";
}
#pragma mark - 保存
- (IBAction)onSave:(id)sender
{
if ([self.userNameTextField.text length] && [self.mobileTextField.text length])
{
//面向模型开发:
NSString *name = self.userNameTextField.text;
NSString *mobile = self.mobileTextField.text;
// NSDictionary *contact = @{
//
// @"name":name,
//
// @"mobile":mobile
//
// };
//创建模型:
Contact *contact = [[Contact alloc] init];
//给模型的两个属性赋值:
contact.name = name;
contact.mobile = mobile;
//我的代理是上一页(联系人列表页) , 我得把这一页的数据传回上一页去显示在上一页的cell里 , 把name信息存到cell的textLabel上 , 把mobile信息传递到上一页cell的detailTextLabel上;
if (_delegate && [_delegate respondsToSelector:@selector(onAddContact:)])
{
[_delegate onAddContact:contact];
}
}
}
#pragma mark - 取消
- (IBAction)onCancel:(id)sender {
//如果我点击的是取消按钮 , 我的代理要实现取消方法 , 让本页回退上一页 , 不带回任何数据;
if (_delegate && [_delegate respondsToSelector:@selector(onCancel:)])
{
[_delegate onCancel];
}
}
#pragma mark - Memory Warning
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
@end
ContactListTableViewController.h
#import <UIKit/UIKit.h>
@interface ContactListTableViewController : UITableViewController
@end
#import "ContactListTableViewController.h"
#import "AddContactViewController.h"
static NSString *const contactReuseIdentifier = @"contactReuseIdentifier";
@interface ContactListTableViewController ()<AddContactViewControllerDelegate>
@property (nonatomic, strong) NSMutableArray *contacts;//数据源数组 ,保存的是存储进来的contact模型;
@end
@implementation ContactListTableViewController
#pragma mark - init
- (instancetype)init
{
self = [super init];
if (self) {
_contacts = [NSMutableArray array];
}
return self;
}
#pragma mark - Life Cycle
- (void)viewDidLoad {
[super viewDidLoad];
//设置UI:
[self setupUI];
//程序一进来读取一下文件:
[self read];
}
#pragma mark - <UITableViewDataSource>
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.contacts.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:contactReuseIdentifier];
if (!cell) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:contactReuseIdentifier];
}
//面向模型开发:
Contact*contact = self.contacts[indexPath.row];
cell.textLabel.text = contact.name;
cell.detailTextLabel.text = contact.mobile;
return cell;
}
#pragma mark - <UITableViewDelegate>
- (BOOL)tableView:(UITableView *)tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath *)indexPath withSender:(id)sender
{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[self.contacts removeObjectAtIndex:indexPath.row];
[self.tableView reloadData];
}
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
}
#pragma mark - setup UI
- (void)setupUI
{
self.title = @"联系人列表";
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"添加"
style:UIBarButtonItemStylePlain
target:self
action:@selector(add:)];
}
- (void)add:(id)sender
{
AddContactViewController *addVc = [[AddContactViewController alloc] init];
addVc.delegate = self;
[self.navigationController pushViewController:addVc animated:YES];
}
#pragma mark - <AddContactViewControllerDelegate>
- (void)onAddContact:(Contact *)contact
{
//将模型存储到数据源数组:
[self.contacts addObject:contact];
[self.tableView reloadData];
[self.navigationController popViewControllerAnimated:YES];
//从 第一页(添加联系人页) 回到第二页(联系人列表页)的时候给我把数据源数组添加完contact模型数据后的这个新的数据源数组保存下来 , 保存成一个plist文件 , 这个文件存在于tmp文件夹内;
[self save];
}
- (void)onCancel
{
//取消添加联系人操作就什么也不做直接回退上一页:
[self.navigationController popViewControllerAnimated:YES];
}
#pragma mark - 写入文件方法
- (void)save
{
//写入plist文件:
// [self.contacts writeToFile:[self filePath] atomically:YES];
//传入一个id对象 , 返回的是NSData对象:
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.contacts];
//然后把NSData对象写入文件中:
[data writeToFile:[self filePath] atomically:YES];
}
#pragma mark - 返回文件真实路径方法
- (NSString *)filePath
{
NSString *temp = NSTemporaryDirectory();
// return [temp stringByAppendingPathComponent:@"contacts.plist"];
return [temp stringByAppendingPathComponent:@"contacts.archive"];
}
#pragma mark - 读取
- (void)read
{
// NSArray *contacts = [NSArray arrayWithContentsOfFile:[self filePath]];
// if (contacts) {
// self.contacts = [NSMutableArray arrayWithArray:contacts];
// }
NSData *data = [NSData dataWithContentsOfFile:[self filePath]];
id object = [NSKeyedUnarchiver unarchiveObjectWithData:data];
if ([object isKindOfClass:[NSArray class]]) {
self.contacts = [NSMutableArray arrayWithArray:object];
}
}
#pragma mark - Memory Warning
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
@end