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

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

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

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

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

我发现自定义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; } } 

如果查看UITableViewDelegate文档,您将看到有五种方法可以自定义编辑行为。 还有方法

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

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

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

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


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

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

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

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

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

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