UITableView 编辑模式

作者: ryugaku | 来源:发表于2016-02-15 02:12 被阅读1010次

    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 编辑模式

        本文链接:https://www.haomeiwen.com/subject/alkpkttx.html