2013-05-08 82 views
1

我更新我UITableView用下面的代码:UITableViewDataSource方法没有得到所谓的

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不调用它的任何数据源方法?

+0

你是否有所有的细胞可以在同一时间吗? – 2013-05-08 10:03:45

+0

你需要调用'[tableView reloadData];'endUpdates – 2013-05-08 10:07:44

+0

after no reloadata,tableView不会调用它的委托方法?@AhmedZ。 – 2013-05-08 10:12:46

回答

2

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

但调用reloadData立即会破坏你的动画或产生奇怪的错误,因为它的行被删除,并调用重载方法。 (它可能会发疯)。备用解决方案是像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. 

不要忘记从你的数据源的阵列或任何你正在使用保存数据删除的数据。

+0

在我的情况下,被删除的行在屏幕中是可见的..我可以看到它被动画删除,但它不调用它的委托或数据源方法。在我的项目中出现错误,或者那是tableview删除的方式。因为它确实有道理,tableview并不需要在删除的情况下调用它的数据源方法,只是想确定我是否可以在某处找到它。 – 2013-05-08 10:25:07

+1

不,没有错。它的正确行为。 [Here's](http://stackoverflow.com/a/861250/593709)另一篇相关文章。 – 2013-05-08 11:03:33

+0

不是一个更好的解决方案在同一'beginUpdates'块内调用'reloadRowsAtIndexPaths:'作为删除而不是混淆延迟因子等吗? – jszumski 2013-05-08 12:50:20

0

答案是一个问题“它为什么要叫所有的数据源和委托方法如果视图已经popuated和所有细胞都是现成的”? 好吧应该是行为

相关问题