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

时间:2012-05-01 02:56:23

标签: iphone ios cocoa-touch uitableview

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

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

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

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

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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:消息,以允许它调整其用户界面。

答案 2 :(得分:0)

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

class MyCell: UITableViewCell {

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

}