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
设置了标志的单元格,但似乎没有任何问题可以解决问题。