首先抱歉,如果格式不正确,第一次这样做。我一直在使用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的任何想法?在此先感谢,如果我还有其他任何可以澄清的内容,请告诉我。
答案 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];
}
如果remlist
和remTable
不是实例变量,您可以使用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];
不知道它是否会有所帮助,因为我不知道你还在做什么。