2012-02-16 63 views
4

首先抱歉,如果格式不正确,首次执行此操作。我一直在使用stackoverflow来查找很长一段时间的帮助,这非常有帮助(谢谢大家),但这是我第一次发布自己的问题。这个问题已被多次询问,但是当我调用[myTable reloadTable]时,调用numberOfSectionsInTableView和numberOfRowsInSection方法,但不调用cellForRowAtIndexPath。reloadData calls numberOfSections,numberOfRows,not cellForRowAtIndexPath

每一个答案,当搜索一直是一个变化我看到: 1)的tableView为零 2)numberOfRowsInSection是0 3)的tableView的委托/数据源未设置 4)调用reloadTable在错误的UITableView 。

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

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

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

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

[email protected]"BUTTON PRESSED"; 
[remTable reloadData]; 
NSLog(@"sleep"); 
sleep(1); 
[remList removeObject:doneReminder]; 
[remTable reloadData]; 

为了测试这一点,我把的NSLog语句在numberofsections,numberofrows和cellforrow开始时,输出是方法,接着是编号的名称(numberofsections/numberofrows)。

输出:

numberofsections 1 
numberofrows 3 
sleep 
numberofsections 1 
numberofrows 2 
cellforrow 

任何想法,为什么cellforrow不是被称为第一次?在此先感谢,请让我知道是否还有其他事情可以补充说明。

回答

8

表视图实际上并不需要它的单元格,直到它需要显示它们。当你打电话给reloadData时,它会立即请求部分和行的数量,以便知道它需要多大。在它被要求显示自己之前,它并不要求细胞本身。视图在每个运行循环的开始处根据需要自动显示。

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

[email protected]"BUTTON PRESSED"; 
[remTable reloadData]; 
[self performSelector:@selector(removeDoneReminder) withObject:nil afterDelay:1.0]; 
- (void)removeDoneReminder { 
    [remList removeObject:doneReminder]; 
    [remTable reloadData]; 
} 

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

+0

我很确定这是正确的答案。 – 2012-02-16 03:36:41

+0

非常感谢你的详细解释,这正是发生了什么,你的建议完美地解决了它。再次感谢您的及时,明确的回应,不能要求更好的答案。 – jasonm 2012-02-16 03:43:51

0

的cellForRowAtIndexPath是UITableView的数据源协议的一部分,确保remtable.datasource被点到self

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

remtable.datasource = self; 

我总是这样做,

remtable.delegate = self; 

希望得到这个帮助

0

尝试使用延迟性能:

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

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

+0

当我面临tableView reloadData的问题时,添加延迟总是解决问题,但我不知道为什么。这是一个肮脏的解决方案 – 2012-04-10 20:53:20

+0

@Hisoka - 这可能是因为你错误地编写了你的​​数据源方法。你不知道他们什么时候会被打电话,所以他们必须以任何时候提供正确答案的方式书写。例如,他们可能会在视图控制器有机会运行任何自己的代码之前调用 - 所以数据还没有准备好。 – matt 2012-04-11 20:46:09