RootViewController.m
#import "RootViewController.h"#import "UIImage+UIImageScale.h"@interface RootViewController ()@property (nonatomic, retain) NSArray *apps;//存放排好序的keys@property (nonatomic, retain) NSMutableArray *keysArray;//字典转模型@property (nonatomic, retain) NSMutableDictionary *addressdic;@end@implementation RootViewController//重写loadView ,将tableView指定为当前视图控制器的视图- (void)loadView{//1.创建UItableView类型的对象 UITableView *tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];//2.指定为视图控制器的根视图 self.view = tableView; //设置数据源 tableView.dataSource = self; //指定为视图的交互 tableView.delegate = self; //3.释放 [tableView release];}- (void)viewDidLoad { [super viewDidLoad]; //获取初始化数据 [self readdataFormPlist]; //配置导航条 [self configureNavigationBarContent]; }#pragma mark -- Editing UITableViewDataSourse//设置tableView的那些行可以允许编辑- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{ return indexPath.section < 3 ? YES : NO;}#pragma mark - Edit UITableViewDelegate//设置tableView行的编辑样式(插入/删除)- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ return indexPath.section < 2 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;}//提交编辑操作时,处理编辑操作- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{ //1.获取key值 NSString *key = self.keysArray[indexPath.section]; //获取删除行所在的数组 NSMutableArray *group = self.addressdic[key]; if (editingStyle == UITableViewCellEditingStyleDelete) { //处理删除操作 //判断是否需要删除一个分区(如果该分区只有一行,就删除整个分区,否则只删除一行) if (1 == group.count) { //删除整个分区 //1.修改数据源 //1.从字典中移除元素 [self.addressdic removeObjectForKey:key]; //2.从排好序的可以key值数组中移除对应的key [self.keysArray removeObject:key]; //2.修改界面 NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.section]; [tableView deleteSections:indexSet withRowAnimation:UITableViewRowAnimationRight]; }else{ //删除一行 //1.修改数据源 [group removeObjectAtIndex:indexPath.row]; //2.修改界面 [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight]; } }else{ //处理添加操作 NSDictionary *dic = @{ @"name":@"马云",@"gender":@"男",@"age":@"16",@"imageName":@"XDLG.png",@"motto":@"-群**成就一个男人",@"phoneNumber":@"123442342"}; //1.修改数据源 [group insertObject:dic atIndex:indexPath.row]; //2.修改界面 [tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationRight]; }}#pragma mark --实现delegate的代理 UITableViewDelegate- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSLog(@"触发了");}//设置删除时确认按钮的文字- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{ return @"删除";}#pragma mark - moving UITableViewdataSource//设置tableView哪些行可以移动- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{ return indexPath.section <= 2 ? YES : NO;}//提交移动操作- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{ //移动操作,只需要,修改数据源即可 //1.获取行所在的数组 NSMutableArray *groupArray = self.addressdic[self.keysArray[sourceIndexPath.section]]; //2.获取对应行的数据,并且保存(要移动的那个人) //retain 是经典 当一个对象从集合中移除的时候 它的引用计数会减1 这些是集合自己管理的 ,retain 后当移除时 对象就不会被销毁. NSDictionary *dic = [groupArray[sourceIndexPath.row] retain]; //3.从数组中原来的位置移除对应的元素 [groupArray removeObjectAtIndex:sourceIndexPath.row]; //4.将元素插入到新的位值中 [groupArray insertObject:dic atIndex:destinationIndexPath.row]; [dic release];}#pragma mark - moving UITavleViewDelegate//当停止拖动的时候,可以实现阻止cell的跨区移动- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{ //sourceIndexPath cell移动之前的位置 //proposedDestinationIndexPath cell 想要移动到的位置 if (sourceIndexPath.section == proposedDestinationIndexPath.section) { return proposedDestinationIndexPath; }else{ return sourceIndexPath; } }#pragma mark --实现数据源中的方法//组- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ return self.addressdic.count;}- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ //在其他方法中需要的的到数据中的图片和个数,所以要把数据源存在属性中 NSString *key = self.keysArray[section]; NSArray *persons = [self.addressdic valueForKey:key]; return persons.count; }- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ static NSString *ID = @"per"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID] autorelease]; } NSString *key = self.keysArray[indexPath.section]; NSArray *persons = [self.addressdic valueForKey:key]; NSDictionary *dic = persons[indexPath.row]; NSString *strimage = dic[@"imageName"]; NSString *strText = dic[@"name"]; cell.imageView.image = [[UIImage imageNamed:strimage] scaleImageToSize:CGSizeMake(35, 40)]; cell.textLabel.text = strText; cell.detailTextLabel.text = dic[@"phoneNumber"]; return cell;}//设置分区title- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ return self.keysArray[section];}//设置分区索引- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{ return self.keysArray;}//初始化数据- (void)readdataFormPlist{ //1.获取本地文件 NSString *filePath = [[NSBundle mainBundle] pathForResource:@"ContactBook.plist" ofType:nil]; //2.初始化字典对象,最外层的是个字典对象 self.addressdic = [NSMutableDictionary dictionaryWithContentsOfFile:filePath]; //当对结合进行快速遍历forin时,不能对集合进行修改 //给字拷贝一个副本,对副本遍历,修改原版 NSMutableDictionary *tempDic = [NSMutableDictionary dictionaryWithDictionary:self.addressdic]; //将字典中的key对应得数组,由不可变数组变成可变可变数组 for (NSString *key in tempDic) { //根据key值取到不可变数组 NSArray *groupArray = self.addressdic[key]; //就不可变数组,改为可变数组 NSMutableArray *newMArray = [NSMutableArray arrayWithArray:groupArray]; //对字典添加 [self.addressdic setObject:newMArray forKey:key]; } //获取所有的key值 NSArray *arraykeys = [self.addressdic allKeys]; NSArray *sortedKeys = [arraykeys sortedArrayUsingSelector:@selector(compare:)]; self.keysArray = [NSMutableArray arrayWithArray:sortedKeys];}//配置导航条- (void)configureNavigationBarContent{ //修改导航条颜色 self.navigationController.navigationBar.barTintColor = [UIColor orangeColor]; //单独定制当去前界面的导航条的颜色,title self.navigationItem.title = @"河南32班通讯录"; //修改字体 NSDictionary *dic = @{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont systemFontOfSize:20]}; self.navigationController.navigationBar.titleTextAttributes = dic; //在导航条右边添加Edit编辑按钮 self.navigationItem.rightBarButtonItem = self.editButtonItem;}//点击Edit按钮触发的方法- (void)setEditing:(BOOL)editing animated:(BOOL)animated{ [super setEditing:editing animated:animated]; //让tableView进入编辑状体 [(UITableView *)self.view setEditing:editing animated:YES];}- (void)dealloc{ self.apps = nil; self.addressdic = nil; self.keysArray = nil; [super dealloc];}@end
UIImage+UIImageScale.h#import@interface UIImage (UIImageScale)- (UIImage *)scaleImageToSize:(CGSize) size;@endUIImage+UIImageScale.m#import "UIImage+UIImageScale.h"@implementation UIImage (UIImageScale)- (UIImage *)scaleImageToSize:(CGSize) size{ //创建一个bitmap的context //并把它设置为当前正在使用的cntext UIGraphicsBeginImageContext(size); //绘制改的大小的图片 [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; //从当前context中创建一个改变大小的图片 UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); //使用当前的context出堆栈 UIGraphicsEndImageContext(); //返回新的图片 return newImage; }@end
Person.h (模型)#import@interface Person : NSObject@property (nonatomic, copy) NSString *imageName;@property (nonatomic, copy) NSString *name;@property (nonatomic, copy) NSString *gender;@property (nonatomic, copy) NSString *age;@property (nonatomic, copy) NSString *phoneNumber;@property (nonatomic, copy) NSString *motto;- (instancetype)initWithDic:(NSDictionary *)dic;+ (instancetype)personWithDic:(NSDictionary *)dic;@endPerson.m#import "Person.h"@implementation Person- (instancetype)initWithDic:(NSDictionary *)dic{ if (self = [super init]) { [self setValuesForKeysWithDictionary:dic]; } return self;}+ (instancetype)personWithDic:(NSDictionary *)dic{ return [[self alloc] initWithDic:dic];}@end