首页 文章

进入/退出编辑模式时重绘UITableViewCell

提问于
浏览
6

我有一个表视图,其中单元格的构建方式不同,具体取决于表是否正在编辑 . 具体来说,选择样式在编辑模式时为无,在不在编辑模式时为蓝色 .

当我从一个转换到另一个时,我注意到一些单元格没有更新 . 快速的日志记录告诉我,即使单元格的外观变化很大(例如正确地添加/删除了附件视图),表格视图也不会刷新选择样式(也不是文本) .

这里发生了什么?调用setEditing时是否只更新了单元格的某些属性?大概只有那些具有允许分配单独视图样式的特定方法的人(例如EditingAccessoryType)?我想我会受益于EditingSelectionStyle .

我该如何解决?通过自定义setEditing来更改每个单元格的selectionStyle?我甚至不确定如何迭代表视图来执行此操作 . reloadData不是一个选项,因为我正在使用一些动画 .

3 回答

  • 6

    我发现自定义setEditing:遍历可见单元格并为每个单元设置selectionStyle以使其正常工作 .

    - (void)setEditing:(BOOL)editing animated:(BOOL)animated{   
        [super setEditing:editing animated:animated];
    
        for (UITableViewCell *cell in [self.tableView visibleCells]) {
                NSIndexPath *path = [self.tableView indexPathForCell:cell];
                cell.selectionStyle = (self.editing && (path.row > 1 || path.section == 0)) ? UITableViewCellSelectionStyleNone : UITableViewCellSelectionStyleBlue;
        }
    }
    
  • 2

    如果您查看UITableViewDelegate documentation,您会看到有五种方法可以自定义编辑行为 . 还有方法

    - (BOOL)tableView:(UITableView *)tableView 
    canEditRowAtIndexPath:(NSIndexPath *)indexPath
    

    UITableViewDataSource documentation中,在进入编辑模式之前将在每个单元格上调用 . 同样如此

    - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView 
               editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
    

    将为所有可编辑的单元格调用 . 如果你想改变单元格的样子,你可以在其中任何一个中进行 . (未实现 canEditRow.. 假设所有行都是可编辑的 . )


    另请注意,在这种情况下,可能还有其他方法可以进入编辑模式,例如在单元格上滑动

    - (void)tableView:(UITableView *)tableView 
    willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
    

    将为您刷过的单元格调用:

    当输入“滑动删除”编辑模式时,表视图会向委托发送tableView:willBeginEditingRowAtIndexPath:消息,以允许它调整其用户界面 .

  • 0

    这适用于Swift 2.3,只是覆盖自定义单元子类中的setEditing方法:

    class MyCell: UITableViewCell {
    
        override func setEditing(editing: Bool, animated: Bool) {
            super.setEditing(editing, animated: animated)
            //Place your code here...
        }
    
    }
    

相关问题