reloadData调用numberOfSections,numberOfRows,而不是cellForRowAtIndexPath

首先抱歉,如果这是格式不正确,第一次这样做。 我一直在使用stackoverflow很长一段时间寻求帮助,这是非常有益的(谢谢大家),但这是我第一次发布我自己的问题。 这个问题已经被问了很多次了,但是当我调用[myTable reloadTable]方法numberOfSectionsInTableView和numberOfRowsInSection被调用,但不是cellForRowAtIndexPath。

我在search时看到的每个答案都是一个变种:1)tableView是无2)numberOfRowsInSection是0 3)tableView的委托/数据源没有设置4)调用reloadTable在错误的uiTableView上。

这些都不是我的情况,所以我想知道还有什么可能是错的。

我想要做什么:我有一个自定义的uitableviewcell上有一个button,当按下button时我想改变单元格的属性(例如,让我们只是说我想改变单元格的标题为“button按下“)。 然后我想暂停一下,然后删除单元格。

不知道这是否重要,但我的tableView是在一个UIViewController,而viewController是委托和数据源。

我有一个方法(下),按下button时触发,单元格属性根据需要进行更改,但是当我尝试刷新表来显示更改不起作用。 第一次调用[remTable reloadData],numberofsectionsintableview和numberofrowsinsection被调用,但不是cellforrowatindexpath。 然而,第二次[remTable reloadData]被调用,所有三个方法被调用,一切工作正常。

doneCell.remName.text=@"BUTTON PRESSED"; [remTable reloadData]; NSLog(@"sleep"); sleep(1); [remList removeObject:doneReminder]; [remTable reloadData]; 

为了testing这个,我把nslog语句放在numberofsections,numberofrows和cellforrow的开头,输出是方法的名字后跟number(对于numberofsections / numberofrows)。

输出:

 numberofsections 1 numberofrows 3 sleep numberofsections 1 numberofrows 2 cellforrow 

任何想法为什么cellforrow不被称为第一次? 在此先感谢,请让我知道,如果还有什么我可以添加澄清。

表格视图实际上并不需要其单元格,直到需要显示它们。 当你调用reloadData ,它会立即请求段和行的数量,以便知道它需要多大。 直到它被要求显示自己,它才会要求单元格本身。 视图在每个运行循环的开始处根据需要自动显示。

在代码返回之前,执行不会返回到运行循环。 当你打电话sleep ,你不执行任何代码,但你也不会返回。 这意味着运行循环没有机会显示表,所以它从不要求任何单元格。 你需要做的是从你的方法返回,并要求在1秒内调用另一个方法来删除doneReminder 。 一个简单的方法是使用performSelector:withObject:afterDelay:方法。 这个方法增加了一个定时器,在给定的延迟之后调用你所要求的方法,这意味着你可以返回到运行循环并让表格显示。

 doneCell.remName.text=@"BUTTON PRESSED"; [remTable reloadData]; [self performSelector:@selector(removeDoneReminder) withObject:nil afterDelay:1.0]; 
 - (void)removeDoneReminder { [remList removeObject:doneReminder]; [remTable reloadData]; } 

如果remlistremTable不是实例variables,则可以使用withObject:参数将它们发送到removeDoneReminder方法。

CellForRowAtIndexPath是UITableView数据源协议的一部分,确保remtable.datasource指向self

所以当你初始化TableView时,你应该添加

 remtable.datasource = self; 

之后,我总是这样做

 remtable.delegate = self; 

希望这个帮助

尝试使用延迟的性能:

 [remtable performSelector:@selector(reloadData) withObject:nil afterDelay:0.1]; 

不知道这是否会有帮助,因为我不知道你在做什么。