Iphone 未调用UITableViewDataSource方法

Iphone 未调用UITableViewDataSource方法,iphone,objective-c,uitableview,Iphone,Objective C,Uitableview,我正在用以下代码更新我的UITableView: int index = [self.guests indexOfObject:_guests]; [[self tableView] beginUpdates]; [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewR

我正在用以下代码更新我的
UITableView

int index = [self.guests indexOfObject:_guests];

[[self tableView] beginUpdates];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationLeft];
[[self tableView] endUpdates];

但是在调用
[[self tableView]endUpdates]
之后,它并没有调用其数据源方法。在添加行的情况下,它调用其数据源方法。我认为在删除的情况下,它不需要向其数据源询问任何事情,但在添加行的情况下,它需要向其数据源询问关于添加的新行(如cellForRow)的几乎所有信息,高度等。我只想确保如果
deleteRowsAtIndexPaths
没有调用其任何数据源方法,那么它是否正确???

deleteRowsAtIndexPaths:indexPaths
在所有情况下都不会调用委托方法。它只是简单地删除行,如果被删除的行太多以至于它们占据了屏幕区域,那么它可能会调用您的委托方法。您必须显式调用
reloadData
,以便它刷新其行

但立即调用
reloadData
会破坏动画或产生奇怪的错误,因为它的行正在被删除,而您需要调用reload方法。(可能会发疯)。另一种解决方案是在0.2或更大的延迟后调用
reloadData
,如下所示:

[self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationLeft];
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.2]; //calling reloadData after a short delay. 0.2 or whatever suits you.
不要忘记从数据源的数组中删除数据,或者删除您用来保存数据的任何内容。

答案是一个问题:“如果视图已被计算且所有单元格都可用,为什么要调用所有数据源和委托方法?”?
好吧,它应该是这样的行为吗?所有的单元格是否同时可见?您需要调用
[tableView reloadData]EndUpdatesUnreloadData之后,tableView将不会调用其委托方法?@AhmedZ。是的,所有单元格都可见,我只想知道,如果我们使用问题中编写的方法从tableView中删除一行,tableView是否会调用其数据源方法。如果我们添加一行,它会调用@a-live。在我的例子中,被删除的行在屏幕上是可见的。我仍然可以看到它在动画中被删除,但它不会调用其委托或数据源方法。我的项目中是否有问题,或者tableview就是这样做的。由于tableview在删除时不需要调用其datasource方法是有意义的,所以我只想确定我是否能找到记录在案的方法不,没有任何错误。这是正确的行为。另一篇相关文章。更好的解决方案不是调用
reloadRowsAtIndexPaths:
在与删除相同的
beginUpdates
块中,而不是混淆延迟因素等吗?@jszumski我猜动画是在后台完成的(单独),我们无法在动画结束时获得回调。这就是为什么执行延迟选择器非常简单的原因。使用
重载rowsatindexpaths
时,我们需要计算哪些路径?(IMHO)两个动画都将在单独的线程上调用,这就是为什么它可能会产生模糊输出。你说呢?所有的动画都是在主线程上完成的。获取要加载的路径很容易,只需使用
tableView.indexPathsForVisibleRows