为什么不应该在删除/插入行的方法上调用 reloadData



我试图实现麻雀一样的行滑动,显示一个动作行(我的起点是这个代码)。

为我创建的每一行。我还创建了一个'backView' UITableViewCell引用父行。这样,当我点击删除上的后视图为例…它知道要删除哪封邮件等等。

而不是使用iOS内置的编辑模式删除…我只是在backView上创建了一个按钮,并附加了一个事件处理程序。父单元格是后视图的委托。后视图将删除任务交给父单元格。

我遵循apple的指示,不在我的事件处理程序方法中添加reloadData。但是后来事情就搞砸了。我删除一行,但它不会被删除,或者被删除的顺序不对,等等。我注意到,如果我只是跳回父菜单后每次删除…一切都很顺利……所以使用这个工作周围(即暴力强迫reloadData)一切工作完美。

我的问题是(抱歉的长介绍)为什么我们被要求不使用reloadData插入/删除方法?或者这个指令只适用于我们使用编辑模式的方式删除行吗?苹果对此并不十分清楚。

试试这个:

  • 用indexPath.row标记你的删除按钮
  • 然后在删除按钮IBAction

假设只有一个section

-(IBAction)deleteBtn:(id)Sender
{
    UIButton *delBtn = (UIButton *)sender;
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:delBtn.tag inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
}

这将只删除indexPath处的行,并且只重新加载该行。

由于- [UITableView reloadData]重新加载所有数据,它基本上使任何临时的、非永久性的UI更改无效。你应该在你的数据结构中反映这些变化,或者,我认为这通常是一个更好的主意,坚持苹果的默认方法(尝试只改变图形,而不是逻辑)。

reloadData完全绕过动画重建表。如果要删除或插入行,使用beginUpdates。下面是解释:

beginUpdates

- (void)开始一系列插入、删除或选择接收器的行和部分的方法调用。如果您希望后续的插入、删除和选择操作(例如,cellForRowAtIndexPath:和indexPathsForVisibleRows)同时显示动画,则调用此方法。这组方法必须以调用endUpdates结束。这些方法对可以嵌套。如果不在此块内进行插入、删除和选择调用,则行数等表属性可能会失效。你不应该在组中调用reloadData;如果你在组中调用这个方法,你将需要自己执行任何动画。

最新更新