2010-02-16 66 views
19

据我所知,UITableView将调用-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath方法来获取表视图的每个单元格。假设我的数据源是通过互联网获取的,我必须考虑延迟。什么是停止这种方法被调用的最佳方式?它应该阻止应用程序中的布尔标志吗?我是否应该在我的应用程序中再次拨打cellForRowAtIndexPath如何停止加载UITableView直到获取数据?

我不确定该函数何时被调用,即UITableView本身“刷新”的频率。任何解释都会有帮助!谢谢!

回答

37

如果您没有数据,或者您没有其他单元格的数据,则只要您不告诉UTableView您有rowCounts或新的rowCounts,则不会调用cellForRowAtIndex:。该值在numberOfRowsInSection:中设定。

换句话说,不要报告numberOfRowsInSection:中的任何新单元格,直到您实际掌握了这些数据,然后cellForRowAtIndexPath:不会被过早地调用。

当您获取附加行数据时,请致电reloadData以获取UITableView以询问行数,然后致电cellForRowAtIndex:

+0

感谢您的回答。以后如何设置numeberOfRowsInSection?当reloadData被调用时,cellForRowAtIndex或numberOfRowsInSection会自动调用吗? – Ying 2010-02-17 00:51:02

+0

是的,当你调用reloadData时,这些调用将会自动进行。 – mahboudz 2010-02-17 07:17:55

+5

另一种方法是在您准备好加载它之前,将“UITableViews.dataSource”属性设置为零。然后你设置它并调用'reloadData'。如果您只需要等待一个请求完成初始表加载,则此功能非常有用。 – zekel 2012-10-15 13:45:46

1

你应该做的是在数据完成读取时在你的表视图上调用reloadData。这将强制表视图再次调用它的委托方法进行显示。无论何时需要重新显示表视图,都会调用这些方法,因此无论是何时显示,滚动还是您手动调用reloadData。

5

如果您已经设置了UITableView数据源和IB代理,那么当您推送到视图时,它至少会使用numberOfRowsInSection方法,但是如果显示的数据来自NSArray,则它将返回计数ZERO,如果数组仍然是空的,所以表格不会用于其他方法的调用。

在实践中,我是从Web服务将数据提取喂表,所以我不设立从IB的数据源和委托,而不是一旦我得到的数据和状态OK响应我设置tableview.datasource = selftableview.delegate = self然后调用reloadData方法更新表。这确保它不会用于numberOfRowsInSection方法,因为您不需要在没有数据的情况下调用它。

+0

和是的,当你设置'tableview.datasource = self'和'tableview.delegate = self'至少在那段时间你不需要调用'reloadData'。 – Hemang 2015-01-29 04:37:18

+0

如何防止tableview在设置数据源时重新加载数据?我希望它手动重新加载,因为我在设置数据源之后做动画。 – Hokage 2015-10-02 04:16:18

1

当您调用[tableView reloadData]时,框架会自动为当前可见的表视图单元格(不是为tableview的所有单元格)再次调用所有数据源方法。所以最好的方法是每次从互联网获取数据时调用reloadData。

相关问题