7

我在使用 UITableView 的reloadData方法时遇到了一些问题。我发现它仅在添加或删除新单元格时才调用 cellForRowAtIndexPath。

示例:我有五个单元格,每个单元格包含五个字符串。如果我添加一个新单元格并调用reloadData,表格会更新并且我会看到它。然而,如果我进入五个单元格之一,添加一个新字符串,然后返回并调用reloadData,则不会调用任何表视图的委托方法。

我的问题:是否可以强制表格视图完全重新加载其所有可见单元格中的数据?

4

6 回答 6

10

我发现了问题——我在块中有我的单元格自定义代码if(cell == nil),所以因为单元格正在被回收,所以它们没有被更改。将我的自定义代码从该块中取出可以解决问题。

于 2012-01-24T23:13:50.273 回答
3

我发现重新加载部分更容易重新加载数据。如果您只有一个部分,您可以尝试:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

于 2013-08-20T13:06:58.113 回答
2

你可以试试这个

[tableView reloadData];

或者

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];

把它放在commitEditingStyle方法中。

于 2017-07-01T05:08:55.127 回答
0

好吧,表格视图只会调用cellForRowAtIndexPath可见单元格,但如果你调用reloadData它会这样做,所以这里还有其他事情发生,我不确定它是什么。

于 2012-01-21T18:34:06.660 回答
0

即使您的 tableview 有 50 行,也只会存在一次可见的尽可能多的单元格。这就是重用标识符背后的全部故事。因此,不存在强制“所有单元格”。如果出现新单元格,则会动态加载数据。

更改单元格的唯一方法是更改​​由 dataSource 方法 cellForRowAtIndexPath 传递的数据。

于 2012-01-21T18:57:09.197 回答
0

不要将您的代码从if (cell == nil)块中取出。相反,为您正在制作的单元格创建一个代表标识符;尝试并确保在标识符中引用了所有单元格的内容。例如,如果您有 3 个数字显示,请确保以唯一的方式在标识符中包含这三个数字,该方式仅引用具有此类内容的单元格。

假设您的类中有三个 NSArray 属性,array1、array2 和 array3,它们的 int 值包含在 NSNumber 对象中。您想使用这些 NSArrays 来填充 UITableView,这就是我要做的:

- (UITableViewCell *)tableView:(UITableView *)tableView 
                     cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@",
                            [[array1 objectAtIndex:indexPath.row] intValue],
                            [[array2 objectAtIndex:indexPath.row] intValue],
                            [[array3 objectAtIndex:indexPath.row] intValue]];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] 
                                  initWithStyle:UITableViewCellStyleDefault
                                  reuseIdentifier:identifier] autorelease];

        //Build your cell here.
    }

    return cell;
}
于 2012-12-18T07:30:15.090 回答