reloadData调用numberOfSections,numberOfRows,而不是cellForRowAtIndexPath

时间:2012-02-16 03:14:02

标签: objective-c ios uitableview

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

我在搜索时看到的每个答案都是以下变体: 1)tableView是零 2)numberOfRowsInSection为0 3)未设置tableView的委托/数据源 4)在错误的uiTableView上调用reloadTable。

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

我正在尝试做什么: 我有一个自定义的uitableviewcell,上面有一个按钮,当按下按钮时我想改变单元格的属性(举个例子,我只想说我想把单元格标题更改为“Button Pressed”)。然后我想暂停片刻,然后删除单元格。

不确定这是否重要,但我的tableView在UIViewController中,viewController是委托和dataSource。

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

doneCell.remName.text=@"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的任何想法?在此先感谢,如果我还有其他任何可以澄清的内容,请告诉我。

3 个答案:

答案 0 :(得分:8)

表视图实际上不会在需要显示它们之前请求其单元格。当你调用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不是实例变量,您可以使用withObject:参数将其发送到removeDoneReminder方法。

答案 1 :(得分:0)

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

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

remtable.datasource = self; 

之后,我总是这样做

remtable.delegate = self;

希望这个帮助

答案 2 :(得分:0)

尝试使用延迟效果:

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

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