<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

简介: 1、tableView的编辑的步骤: 1.让tableView处于编辑状态,(默认所有的cell都处于编辑状态,默认下的编辑样式是删除) 2.
1、tableView的编辑的步骤:
 1.让tableView处于编辑状态,(默认所有的cell都处于编辑状态,默认下的编辑样式是删除)
 2.设置哪些cell可以编辑
 3.设置编辑的样式(删除,插入)
 4.提交编辑结果(先修改数据源,再修改UI)
 tableView的移动的步骤:
 1.让tableView处于编辑状态
 2.设置哪些cell可以移动
 3.提交移动结果
图片素材: TableEdit <wbr>UI_10

本节素材 plist 文件下载: http://pan.baidu.com/s/1c0yiV8O
————————————————————————————————
AppDelegate.m
  self.window.rootViewController = [[[UINavigationController alloc]initWithRootViewController:[RootViewController alloc]]autorelease];
RootViewController.m
#import "RootViewController.h"
#import
"DetailViewController.h"
@interface RootViewController ()<</span>UITableViewDataSource,UITableViewDelegate>
@property(nonatomic,retain)NSMutableDictionary *dict;
@property(nonatomic,retain)NSMutableArray *orderKeys;
@end

@implementation RootViewController
-(
void)dealloc{
   
self.dict = nil;
   
self.orderKeys = nil;
    [
super dealloc];
}
重写loadView方法,将UITableView指定为视图控制器的对象
- (void)loadView{
   
UITableView *tableView = [[UITableView alloc]initWithFrame:[UIScreen mainScreen].bounds style:(UITableViewStylePlain)];
   
//设置数据源代理
    tableView.
dataSource = self;
   
//设置业务代理
    tableView.
delegate = self;
   
//将tableView 指定为rootViewController 根视图
   
self.view = tableView;
   
    [tableView
release];
}

- (void)viewDidLoad {
    [
super viewDidLoad];
    self.view.backgroundColor = [UIColor brownColor];
    配置导航条的方法
    [self configureNavigationContent];
    从plist文件读取数据
    [self readDataFromPlist];
}

从plist文件读取数据
- (void)readDataFromPlist{
   1.获取文件路径
 NSString *filePath = [[NSBundle mainBundle]pathForResource:@"Contacts.plist" ofType:nil];
   
   2.根据文件路径初始化字典对象,因为此时文件的最外层是字典
    self.dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
//    NSLog(@"%@",diict);//验证是否取出来
   
    copy一个一摸一样的字典出来,枚举copy出来的字典,修改原来的字典
    NSDictionary *copyDict = [NSDictionary dictionaryWithDictionary:self.dict];
    遍历字典
    for (NSString *key in copyDict) {
       
NSArray *array = copyDict[key];
   
//初始化可变数组
       
NSMutableArray *mArr = [NSMutableArray arrayWithArray:array];
        [
self.dict setValue:mArr forKey:key];
    }
   
   
   
//3.获取字典中所有的key值
   
NSArray *keys =  self.dict.allKeys;
   
//4.对数组中keys排序
  
NSArray *array =  [keys sortedArrayUsingSelector:@selector(compare:)];
   
//5.初始化存放key的数组
   
self.orderKeys = [NSMutableArray arrayWithArray:array];
   
}

//配置导航条的显示的内容
- (
void)configureNavigationContent{
   
self.navigationItem.title  = @"通讯录";
   
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
   
//设置编辑按钮
   
self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//重写点击Edit按钮方法
- (
void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [
super setEditing:editing animated:animated];
//    NSLog(@"%d",editing);    验证可编辑状态
//    editing    为1时可以编辑,为0时不可以编辑
    [(UITableView *)self.view  setEditing:editing animated:YES ];  
}

——————————————————————————————————
#pragma mark 必须实现的数据源代理方法
//2.配置哪些cell可以编辑
- (
BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath{
//    if (indexPath.section < 3) {
//        return YES;
//    }
//    return NO;
   
return indexPath.section <</span> 3 ? YES : NO;
}
//设置deligt为删除
- (
NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
   
return @"删除";
}
//4.提交编辑操作
- (
void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
  
//先修改数据源再更新UI(界面)
   
//1.根据分区索引获取key值,确定要删除的cell在哪个分区(eg:B分区 D分区)
   
NSString *key  = self.orderKeys[indexPath.section];
   
//2.根据key值拿到字典中对应的分组
   
NSMutableArray *group = self.dict[key];
   
   
   
//删除
   
if (editingStyle == UITableViewCellEditingStyleDelete) {
     //处理删除操作
       if (1 == group.count) {//删除整个分组
            //1.先删除数据源,从字典中移除key值
            [
self.dict removeObjectForKey:key];
           
//删除索引栏数组中的对应的元素
            [
self.orderKeys removeObjectAtIndex:indexPath.section];
           
           
//2.更新UI界面
           
//创建一个NSIndexSex 对象,使用分区下标初始化
           
NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:indexPath.section];
            [tableView
deleteSections:indexSet withRowAnimation:(UITableViewRowAnimationLeft)];
           
        }
else{//删除对应的cell即可
           
//先删除数据源
            [group
removeObjectAtIndex:indexPath.row];
           
//再更新UI界面
           
//tableView删除是可以删除多行
            [tableView
deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationLeft)];
        }
       
    }
else{//添加
       
//1.准备要插入的数据
       
NSDictionary *dic = @{@"name":@"黄凯",@"gender":@"妖",@"age":@"25",@"phone":@"3838438",@"imageName":@"1.png",@"says":@"千人斩"};
       
//2.修改数据源
        [group
insertObject:dic atIndex:indexPath.row];
      
//3.更行UI界面
        [tableView
insertRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationRight)];
       
    }
   
}

- (
NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
   
//根据字典中键值对的个数返回二分区个数
   
return self.dict.count;
}

//返回row个数
- (
NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
   
//1.获取对应分区下标所对应的key值
   
NSString *key = self.orderKeys[section];
   
  
//2.根据key值取出字典的value值并且返回数组元素的个数
   
return [self.dict[key]count];
}
//返回区头标题
- (
NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
   
//返回对应分区区头
   
return self.orderKeys[section];
}
//返回右侧索引栏
- (
NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
   
return self.orderKeys;
   
}

- (
UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
   
   
//1.重建重用id标示
   
static NSString *identifier = @"cell";
   
//2.tableView对象去重用池取可以重用的cell
 
UITableViewCell *cell =    [tableView dequeueReusableCellWithIdentifier:identifier];
   
//3.判断有没有取到cell
   
if (cell == nil) {
        cell = [[[
UITableViewCell alloc]initWithStyle:(UITableViewCellStyleSubtitle) reuseIdentifier:identifier]autorelease];
       
    }

   
//展示数据步骤:
   
//1.根据cell所在分区的索引获取对应的key值
   
NSString *key = self.orderKeys[indexPath.section];
   
//2.根据key值获取字典中的value值
   
NSArray *values = self.dict[key];
   
//3.根据row的索引获取数组中对应的元素
   
NSDictionary *pDict = values[indexPath.row];
//    NSLog(@"%@",pDict);//验证是否取得字典中的人信息
   
//4.取出字典中数据用cell展示
    cell.
imageView.image = [UIImage imageNamed:pDict[@"imageName"]];
    cell.
textLabel.text = pDict[@"name"];
    cell.detailTextLabel.text = pDict[@"phone"];
   
    return cell;
}
————————————————————————————————
#pragma mark  tableView 的移动
//设置哪些行可以移动
- (
BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{
   
return YES;
}
//提交移动后的操作
- (
void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath{
//    sourceIndexPath   cell原来的位置
//    destinationIndexPath  cell移动之后的位置
//   移动操作不需要更新UI界面,因为移动的时候UI界面已经发生了变化,此时只需修改数据源即可

   
   
//首先获取cell展示的数据所在的数组
   
//1.取出key值

   
NSString *key = self.orderKeys[sourceIndexPath.section];
   
//2.取出字典中key值对应的数组
   
NSMutableArray *mArr =  self.dict[key];
   
   
//3.将原来的数据取出来一份保存起来
   
NSDictionary *dic = [mArr[sourceIndexPath.row]retain];//2
   
//4.删除数组中原来位置的元素
    [mArr
removeObjectAtIndex:sourceIndexPath.row];//1
   
//5.将元素插入到数组中新的位置
    [mArr
insertObject:dic atIndex:destinationIndexPath.row];//2
   
//释放dic
    [dic
release];//1
   
}

//如果移动过后不是在原来的分区,则取消移动结果返回原来位置
- (
NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath{
//    sourceIndexPath   cell原来的位置
//    proposedDestinationIndexPath  cell移动之后的位置
   
//如果在同一分区则让cell移动,返回移动后的位置

   
if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
     
       
return proposedDestinationIndexPath;
    }
else{//如果不在同一分区,返回移动之前的位置
       
return sourceIndexPath;
       
    }
   
}
——————————————————————-——————————
#pragma mark 业务代理方法的实现
//3.设置tableView的编辑样式
- (
UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
   
//    if (indexPath.section < 2) {
//        return UITableViewCellEditingStyleDelete;
//    }else{
//        return UITableViewCellEditingStyleInsert;
//    }
//    return NO;
   
return indexPath.section <</span> 2 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;
}
//设置行高
- (
CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   
return 80.0;
}

- (
void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
   
DetailViewController *detailVC = [[DetailViewController alloc]init];
   
   
NSString *key = self.orderKeys[indexPath.section];
   
NSMutableArray *mArr = self.dict[key];
   
//取出数组中的字典并赋值给属性
   
NSDictionary *dic = mArr[indexPath.row];
    detailVC.
dic = dic;
   
    [
self.navigationController pushViewController:detailVC animated:YES];
    [detailVC
release];
   
}
=======================================================
DetailViewController.h
@property(nonatomic,retain)NSDictionary *dic;
DetailViewController.m
- (void)dealloc{
   
self.dic = nil;
    [
super dealloc];
}
- (
void)viewDidLoad {
    [
super viewDidLoad];
       
self.view.backgroundColor = [UIColor whiteColor];
    [(
DetailView *)self.view assignAllController:self.dic];
}

- (
void)loadView{
   
DetailView *detaileView = [[DetailView alloc]initWithFrame:[UIScreen mainScreen].bounds];
   
self.view = detaileView;
    [detaileView
release];
}
最终效果:
TableEdit <wbr>UI_10

===================================================
传值不做介绍,仅供参考!
欢迎学习本文,未经许可,禁止转载!
目录
相关文章
|
Web App开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
TCP洪水攻击(SYN Flood)的诊断和处理 Posted by  海涛  on 2013 年 7 月 11 日 Tweet1 ​1. SYN Flood介绍 前段时间网站被攻击多次,其中最猛烈的就是TCP洪水攻击,即SYN Flood。
1171 0
|
Web App开发 存储 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
      前段时间公司hadoop集群宕机,发现是namenode磁盘满了, 清理出部分空间后,重启集群时,重启失败。 又发现集群Secondary namenode 服务也恰恰坏掉,导致所有的操作log持续写入edits.new 文件,等集群宕机的时候文件大小已经达到了丧心病狂的70G+..重启集群报错 加载edits文件失败。
1063 0
|
Web App开发 监控 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Datanode的日志中看到: 10/12/14 20:10:31 INFO hdfs.DFSClient: Could not obtain block blk_XXXXXXXXXXXXXXXXXXXXXX_YYYYYYYY from any node: java.
790 0
|
Web App开发 数据库
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
可伸缩系统的架构经验 Feb 27th, 2013 | Comments 最近,阅读了Will Larson的文章Introduction to Architecting System for Scale,感觉很有价值。
2457 0
|
Web App开发 前端开发 程序员
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
Facebook 内部分享:不论你如何富有,你都赚不到更多的时间,你也回不到过去。没有那么多的假如,只有指针滴答的时光飞逝和你应该好好把握的现在,以下25张PPT的分享将为您带来时间价值管理的技巧。
696 0
|
Web App开发 前端开发 测试技术
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
ClusterId read in ZooKeeper is null. Re-running the program after fixing issue 1 will result in the following e...
906 0
|
Web App开发 前端开发
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
一个典型的星型模式包括一个大型的事实表和一组逻辑上围绕这个事实表的维度表。  事实表是星型模型的核心,事实表由主键和度量数据两部分组成。
618 0
|
Web App开发 前端开发 大数据
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
提  纲     1、移动DSP与传统营销有什么不同?     2、为什么移动DSP是大势所趋?     3、哪些因素决定移动DSP的精准与否?     4、如何辨别移动DSP的真伪优劣?     ...
1076 0

热门文章

最新文章