UITableView 编辑模式
相关方法
UITableView
插入、删除和移动表格的行和分区 (Inserting, Deleting, and Moving Rows and Sections)
//对表格执行多个连续的插入、删除和移动操作前,调用开始更新
- (void)beginUpdates;
//对表格执行多个连续的插入、删除和移动操作后,调用结束更新
- (void)endUpdates;
//在一个或多个indexPath处插入cell
- insertRowsAtIndexPaths: withRowAnimation:
//删除一个或多个indexPath处的cell
- deleteRowsAtIndexPaths: withRowAnimation:
//将指定indexPath对应的cell移动到另一个indexPath
- moveRowAtIndexPath: toIndexPath:
//在表格中用所选的动画插入一个或多个分区
- insertSections: withRowAnimation:
//在表格中用所选的动画删除一个或多个分区
- deleteSections: withRowAnimation:
//将指定分区移动到另一个位置
- moveSection: toSection:
Managing the Editing of Table Cells
//默认值NO. YES则进入编辑状态
BOOL editing
- setEditing: animated:
UITableViewDataSource
插入或删除表格行 (Inserting or Deleting Table Rows)
//对指定cell编辑完成时触发
- tableView: commitEditingStyle: forRowAtIndexPath:
//返回值决定指定indexPath对应的cell是否可编辑
- (BOOL)tableView: canEditRowAtIndexPath:
重新排列表格行 (Reordering Table Rows)
//返回值决定指定indexPath对应的cell是否可移动
- (BOOL)tableView: canMoveRowAtIndexPath:
//该方法告诉DataSource将指定的cell移动到另一个位置
//单元格的移动相关
- tableView: moveRowAtIndexPath: toIndexPath:
UITableViewDelegate
编辑表格行 (Editing Table Rows)
//开始编辑某个cell时触发
- tableView: willBeginEditingRowAtIndexPath:
//完成编辑某行时触发
- tableView: didEndEditingRowAtIndexPath:
//返回值决定了该cell的编辑状态
- (UITableViewCellEditingStyle)tableView: editingStyleForRowAtIndexPath:
//返回值将作为删除指定cell时确定按钮的文本
- (NSString *)tableView: titleForDeleteConfirmationButtonForRowAtIndexPath:
//返回的BOOL值决定指定cell处于编辑状态时,该cell是否应该缩进
- (BOOL)tableView: shouldIndentWhileEditingRowAtIndexPath:
实例
@interface TableViewController () {
// 记录当前正在执行的操作. 0代表删除, 1代表插入
NSInteger _action;
NSMutableArray *_list;
}
@property (weak, nonatomic) IBOutlet UIBarButtonItem *insertBtn;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *deleteBtn;
@end
@implementation ViewController
- (IBAction)Edit:(UIBarButtonItem *)sender {
if ([sender.title isEqualToString:@"删除"]) {
_action = 0;
} else {
_action = 1;
}
[self.tableView setEditing:!self.tableView.isEditing animated:YES];
if (self.tableView.isEditing) {
self.insertBtn.title = @"完成";
self.deleteBtn.title = @"完成";
} else {
self.insertBtn.title = @"插入";
self.deleteBtn.title = @"删除";
}
}
- (void)viewDidLoad {
[super viewDidLoad];
_list = [NSMutableArray arrayWithObjects:@"美国", @"日本", @"中国", @"韩国", @"朝鲜", @"英国", nil];
}
#pragma mark - UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return _list.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *reuseID = @"reuseID";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseID];
cell.textLabel.text = _list[indexPath.row];
return cell;
}
// 返回值决定指定indexPath对应的cell是否可编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
// if (indexPath.row == 2) return NO;
return YES;
}
// 返回值决定指定indexPath对应的cell是否可移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
// 该方法告诉DataSource将指定位置的行移动到另一个位置
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
// 获取将要移动的数据
id targetObj = _list[sourceIndexPath.row];
// 从集合中删除指定数据项
[_list removeObjectAtIndex:sourceIndexPath.row];
// 将移动的数据项插入到指定位置
[_list insertObject:targetObj atIndex:destinationIndexPath.row];
}
// 编辑完成时触发该方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleInsert) {
// 插入操作
// 将数据插入到集合中
[_list insertObject:_list[indexPath.row] atIndex:indexPath.row + 1];
// 在界面上插入一行
[tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
} else {
// 删除操作
// 从集合中删除数据项
[_list removeObjectAtIndex:indexPath.row];
// 从界面上删除指定行
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
}
}
#pragma mark - UITableViewDelegate
// 返回值决定了该cell的编辑状态
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return _action == 0 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;
}
// 返回值将作为删除指定cell时确定按钮的文本
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
return @"确定删除";
}
@end
网友评论