7

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

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

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

我应该如何解决?通过自定义 setEditing 来更改每个单元格的 selectionStyle?我什至不确定我将如何遍历表视图来做到这一点。reloadData 不是一个选项,因为我正在使用一些动画。

4

3 回答 3

8

我发现自定义 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;
    }
}
于 2012-05-03T18:58:20.937 回答
2

如果您查看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: 消息,以允许它调整其用户界面。

于 2012-05-01T09:23:21.410 回答
1

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

class MyCell: UITableViewCell {

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

}
于 2016-12-20T03:22:11.037 回答