cellForRowAtIndexPath没有被调用但是numbersOfRowInSection是

时间:2013-11-25 12:43:29

标签: ios for-loop uitableview

我的项目中有for loop,如下所示:

 for (int i = 0; i < 2; i++) {
        [array addObject:randomObject];
        [self.tableView reloadData];
 }

我有这样的dataSource方法:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"Count: %lu",(unsigned long)array.count);
    return [array count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Reloading Data");
    static NSString *CellIdentifier = @"Random";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    return cell;
}

但由于某些奇怪的原因,只有numberOfRowsInSection被调用而cellForRowAtIndexPath没有被调用。

此外,在循环的最后一次(当x = 1时)调用cellForRowAtIndexPath

2 个答案:

答案 0 :(得分:4)

tableview仅在更新其视图层次结构时询问单元格。不重新加载其数据时。这只会导致它更新其内部大小信息。

仅在runloop进入时才会更新单元格。当您处于循环中时,主线程被阻塞,然后runloop不会进行。

只有在循环之后,操作系统才会运行runloop,而表格会调用Cells。

答案 1 :(得分:2)

在同一个线程上调用所有数据源方法。通过调用reloadData,您可以启动数据源方法的“队列”,再次调用它可以取消之前的“队列”。这种机制可以保护数据源不会出现不一致,就像您更改了数据一样(因此下一次reloadData调用),第一个“队列”操作将会过时。