强制UITableView为所有单元格调用cellForRowAtIndexPath :.

时间:2012-01-21 18:28:54

标签: ios reloaddata uitableview

我在使用UITableView的reloadData方法时遇到了一些麻烦。我发现如果添加或删除了新的单元格,它只调用cellForRowAtIndexPath。

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

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

6 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

你可以试试这个

[tableView reloadData];

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

将其放在commitEditingStyle方法中。

答案 3 :(得分:0)

嗯,表格视图只会在可见单元格上调用cellForRowAtIndexPath,但是如果你打算调用reloadData它会这样做,所以这里还有其他东西,我不知道它是什么是

答案 4 :(得分:0)

即使你的tableview有50行,也只会存在尽可能多的单元格。这就是reuseIdentifier背后的全部故事。所以强迫'所有细胞'不存在。如果出现新单元格,则会动态加载数据。

更改单元格的唯一方法是更改​​dataSource方法cellForRowAtIndexPath提供的数据。

答案 5 :(得分: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;
}