在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}的单元格标志设置,但似乎没有解决问题。
答案 0 :(得分:32)
我有这个问题,对我来说答案是一个“doh”时刻。请务必在您自己的实施中调用super
prepareForReuse
的实施。