dequeueReusableCellWithIdentifier在IOS 7中返回处于编辑状态的单元格

时间:2013-09-27 21:47:21

标签: uitableview

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

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

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

[该图像可能永远无法使用,因此这里有一个描述:滚动后,新单元格仍处于最终编辑状态,DELETE按钮仍然可见,单元格内容在屏幕左侧。] < / p>

此外,返回的单元格甚至设置了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:返回仍然具有{{1}的单元格标志设置,但似乎没有解决问题。

1 个答案:

答案 0 :(得分:32)

我有这个问题,对我来说答案是一个“doh”时刻。请务必在您自己的实施中调用super prepareForReuse的实施。