UITableView 编辑模式

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

你可能感兴趣的:(UITableView 编辑模式)