14

IOS 7之前的版本不会出现以下问题。

使用 UITableView 的滑动编辑界面删除项目,删除项目并滚动后,新显示的单元格(从 中返回dequeueReusableCellWithIdentifier)如下所示:

https://dl.dropboxusercontent.com/u/87749409/Screenshot%202013.09.27%2016.08.30.png

[该图像可能不会永远可用,所以这里是一个描述:滚动后,新单元格仍处于最终编辑状态,删除按钮仍然可见,单元格内容在左侧屏幕外。]

此外,返回的单元格甚至有它的editing设置了其标志。

我用来删除单元格的代码如下所示:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        // Find the item that this cell represents
        NSDictionary *item = [self itemForRowAtIndexPath:indexPath];
        if (!item) return;

        [tableView beginUpdates];
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationTop];
        [tableView endUpdates];

        // Remove it from the data store
        [Inventory removeInventoryItem:item];
    }
}

我能够通过一个被黑的解决方案克服这个问题。代码(带有hack)是:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    InventoryCell *cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];

    // HACK - here we create a new cell when we try to reuse deleted cells. 
    // Deleted cells, when re-used, would still appear as if they were edited,
    // with the cell slid off to the far left and the DELETE button visible.
    while(cell && cell.editing)
    {
        cell = [tableView dequeueReusableCellWithIdentifier:kInventoryCellID];
    }

    if (!cell)
    {
        cell = [[InventoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kInventoryCellID];
    }

    return cell;
}

使用 hack(while 循环)会生成一个不处于编辑状态的新单元格。这会导致一些内存浪费,但确实会产生正确的结果。

prepareForReuse我想知道在重置编辑状态的方法中是否需要做一些事情。目前,我的prepareForReuse方法仅使用默认值初始化内部的控件(标签等)。

我已经尝试setEditing:animated:在删除单元格时调用 UITableViewCell 和 UITableView ,prepareForReuse并且无论何时dequeueReusableCellWithIdentifier:返回一个仍然editing设置了标志的单元格,但似乎没有任何问题可以解决问题。

4

1 回答 1

32

我遇到了这个问题,对我来说答案是“doh”时刻。确保在您自己的实现中调用实现superprepareForReuse

于 2013-09-27T21:50:16.883 回答