AdressBook通讯录
1.本示例重点是UITableView的解析,UITableViewDataSource\UITableViewDelegate代理方法的使用
2.第一步:解析plist文件
通过KVC把字典转化为模型,转化为实际的一组组联系人,而不是空牢牢的一组组数据(其实都是数据,呈现形式不同而已)。
2.实现代理方法(UITableViewDataSource\UITableViewDelegate协议方法)
必须实现的方法:
// 行数(组数默认1)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
// 每行显示的内容(cell的内容)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
通过参数indexPath可以准确的从模型字典中锁定联系人,获得联系人的信息 --- 给cell赋值--- 实现对cell的加载
还有一些可选的代理方法:(简写---提示性的)
例如:设置行高(row)的代理方法---heightforrow 设置分组头部显示的内容的代理方法---titleforheader 设置分组头部高度的高度的代理方法--- heightforheader
设置索引的代理方法--- sectionIndexTitleForTableView cell点击实现跳转的代理方法---didSelectRowAtIndexPath
设置能否进入编辑状态的代理方法---canEdit 设置那种编辑状态的代理方法---editingStyle 编辑状态下代理方法的实现---commitEditng
设置能否移动的代理方法--- canmove 设置移动的实现方法---moverow 设置限制移动范围的代理方法--- target 修改“删除(title)”的代理方法---titilefordelete
通过这些代理方法 我们可以显示基本的联系人信息(分组 索引),在编辑状态下可以对联系人信息一定的编辑操作(删除 同组减一同)
3.自定义代理方法---实现页面间的传值
3.1从主页面把联系人(模型)穿到详细页面
在代理方法中设置代理 同时实现了页面间的跳转--- 跳转到详情页面---利用传过来的模型 给详情页面赋值---实现详情页面的展示功能
3.2实现添加功能---从添加页面--把数据转化为模型---利用代理传到主页面
在添加页面点击右边的“保存”按钮
#pragma mark 添加点击方法
- (void)rightBarButtonItemDidClickedAction:(UIBarButtonItem *)sender
{
BCContact *contact = [[BCContact alloc] init];
contact.name = self.rootView.nameTextField.text;
contact.gender = self.rootView.genderTextField.text;
contact.age = self.rootView.ageTextField.text;
contact.hobby = self.rootView.hobbyTextField.text;
contact.phoneNumber = self.rootView.phoneNumberTextField.text;
contact.picture = self.rootView.pictureTextField.text;
// 让代理去执行 协议方法
[self.delegate translateToContactsVCWithContact:contact];
// 返回上一级
[self.navigationController popToRootViewControllerAnimated:YES];
}
利用从主页面跳转到添加页面的响应方法 设置代理
#pragma mark leftBarButtonItem的响应方法
- (void)leftBarButtonItemDidClickedAction:(UIBarButtonItem *)sender
{
BCAddViewController *addVC = [[BCAddViewController alloc] init];
// 设置addVC的代理为自己 (代理设置 只能在这里设置)
addVC.delegate = self;
[self.navigationController pushViewController:addVC animated:YES];
}
在主页面执行代理方法---模型已传过来---利用传过来的模型修改数据源---同时修改TableView(刷新)
#pragma mark 实现add页面的代理方法
-(void)translateToContactsVCWithContact:(BCContact *)contact
{
// 姓名的首字母
NSString *string = [ChineseToPinyin pinyinFromChiniseString:contact.name];
NSString *firstStr = [string substringToIndex:1];
if ([self.keysArray containsObject:firstStr]) {
NSMutableArray *groupArray = [self.dictData valueForKey:firstStr];
// 数据源
[groupArray insertObject:contact atIndex:0];
// cell --- 刷新
[self.rootView.mainTableView reloadData];
}else{
// 创建数组 把联系人放到数组里面
NSMutableArray *array = [NSMutableArray array];
[array insertObject:contact atIndex:0];
// 数据源
[self.dictData setObject:array forKey:firstStr];
[self.keysArray addObject:firstStr];
[self.keysArray sortUsingSelector:@selector(compare:)];
// cell --- 刷新
[self.rootView.mainTableView reloadData];
}
}