UITableView reloadData似乎不会导致cellForRowAtIndexPath:被调用

我目前正在写一个应用程序,使用故事板,在同一个窗口中包含两个UITableView

运行应用程序时,第一个UITableView将填充一些“注册号”。

当用户点击一个单元格时,第二个UITableView应该填充有关所选单元格的详细信息。

当在第一个表中点击一个数字时,我有一个方法来驱动:

 [mySecondTableView reloadData] 

它做什么。 我的印象是,当调用reloadData命令,它应该然后调用两个:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

第一次火灾,但第二次不会。 我有自己的数据源和委托连线。

我不知道我错过了什么。

两种方法都是为了开火吗?

当这样的事情发生在我身上时,通常是因为我在主线程之外调用了-reloadData

reloadData之后,试试这个:

 NSIndexSet * sections = [NSIndexSet indexSetWithIndex:0]; [self.tableView reloadSections:sections withRowAnimation:UITableViewRowAnimationNone]; 

我发现,如果数据的变化是微妙的,表格视图似乎优化了需要刷新。

指出的答案并不能解决我的表格视图问题。 它仍在呼唤

 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

然而单元格绘制方法没有被激发:

 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

我的问题是(因为我的错误,当然)表视图的高度是0.所以作为表格只显示单元格是可见的,它从来没有试图显示一个单元格。 当我改变高度值绘图单元格方法开始重新开火。

Botom线仔细检查你的表框,并确保你有非零的宽度和高度值!

我刚刚招致同样的问题。 我用performSelectorOnMainThread来调用一个方法,然后调用reloadData 。 这是必要的,因为我正试图在hatfinchbuild议的主线外进行更新。

确保你用waitUntilDone调用了performSelectorOnMainThread:否,否则你可能仍然有同样的问题

发现cellForRowAtIndexPath不被调用的另一个原因。

如果numberOfRowsInSection返回0,则不会调用cellForRowAtIndexPath 。 这发生在我的情况下,因为在视图控制器更改期间NSArray被解除分配,并且因此计数(因为它为零)返回0。

我的头靠在墙上撞了几天后,解决了我的问题:

设置所有exception断点,看看你是否在你的数据源中出现越界exception。 没有设置断点没有崩溃,tableview将无法重新加载。

完整答案在这里

在我意识到我的.reloadData()调用正在被视图控制器的前一个实例的callback执行之前,我正在debugging类似的问题几个小时。

所以我的断点是在该视图控制器的旧实例的.reloadData()调用上,但实际显示的新实例不是重装,因为它不是执行调用.reloadData()的callback的.reloadData()