可编辑的TableView

在编写简单的导航控制器基础上,让TableView的条目是可编辑的。这里示例将实现对条目的排序,删除等类似。实现的效果:
  
在编写简单的导航控制器基础上做如下修改。
首先要将存储数据的NSArray改为NSMutableArray,因为前者是不可变的。在头文件中:

@interface RootViewController : UITableViewController <UITableViewDelegate,UITableViewDataSource>{ 
    NSMutableArray *dataItems;

在m文件中:

dataItems= [[NSMutableArray alloc] initWithObjects:@"张三",@"李四",nil];


然后,增加导航条右侧的按钮。先写出点击按钮的函数:

-(IBAction)toggleMove{ 
    [self.tableView setEditing:!self.tableView.editing animated:YES]; 
}

下面,声明按钮并关联上述函数:

- (void)viewDidLoad { 
    dataItems= [[NSMutableArray alloc] initWithObjects:@"张三",@"李四",nil]; 
    self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc] initWithTitle:@"移动" 
                                                                            style:UIBarButtonItemStyleBordered 
                                                                           target:self 
                                                                           action:@selector(toggleMove)]; 
    [super viewDidLoad]; 
}


其实就是增加一句话。
添加有关显示风格等的函数:

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return UITableViewCellEditingStyleNone; 
}
-(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath{ 
    return YES; 
}

其中,后者(canMoveRowAtIndexPath)如果不写,将是删除而不是移动。
在原有生成表条目的函数中增加一句话,用于显示右侧的控件:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
         cell.showsReorderControl=YES; 
    }

下面是最关键的函数,在移动表条目时回调的函数:

-(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *) fromIndexPath 
     toIndexPath:(NSIndexPath *)toIndexPath{ 
    id object=[[dataItems objectAtIndex:[fromIndexPath row]] retain]; 
    [dataItems removeObjectAtIndex:[fromIndexPath row]]; 
    [dataItems insertObject:object atIndex:[toIndexPath row]]; 
    [object release]; 
}

这样就可以实现上述的效果了,不过会出现这样的警告日志:

2010-10-13 22:42:47.220 NavTest[77449:207] WARNING: Using legacy cell layout due to delegate implementation of tableView:accessoryTypeForRowWithIndexPath: in <RootViewController: 0x5c04150>.  Please remove your implementation of this method and set the cell properties accessoryType and/or editingAccessoryType to move to the new cell layout behavior.  This method will no longer be called in a future release.

因为accessoryTypeForRowWithIndexPath函数已经不建议使用了,要替换成:

// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
        cell.showsReorderControl=YES; 
        cell.accessoryType=UITableViewCellAccessoryDetailDisclosureButton;
    } 
    NSUInteger row=[indexPath row]; 
    cell.textLabel.text=[dataItems objectAtIndex:row];
    return cell; 
}

同时删除tableView:accessoryTypeForRowWithIndexPath函数。这个问题不是编辑TableView时出现的,在前面写的编写简单的导航控制器中就开始有这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值