0

我有一个由 NSFectchedResultsController 支持的表格视图,当我没有来自 FRC 的结果时,我试图显示一个自定义单元格。我遇到的问题是 BeginUpdates 会调用 numberOfRowsInSection。我想保持表格视图处于活动状态(而不仅仅是在其位置显示图像),以便用户可以执行拉动刷新。

编码:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
if ([self.fetchedResultsController.fetchedObjects count] == 0) {
    if (!specialCellShowing) {
        specialCellShowing = TRUE;
        [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
        [self.tableView beginUpdates];
        [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView endUpdates];
    }
    return 1;
}
else {
    if (specialCellShowing) {
        specialCellShowing = FALSE;
        [self.tableView beginUpdates];
        [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:0 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
        [self.tableView endUpdates];
    }
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];
    return [self.fetchedResultsController.fetchedObjects count];
}

}

问题是返回 1;陈述。发生的情况是第一次调用 numberOfRowsInSection 时,它设置 specialCellShowing = TRUE 并点击开始更新,这会调用 numberOfRowsInSection。该方法的开始更新实例发现 specialCellShowing 为真并返回 1 并退出。现在进行了插入调用,然后在 endUpdates 上发生了崩溃,因为 tableview 认为表中有 1 个单元格,插入了 1 个单元格,之前有 1 个单元格。另一个问题是我需要返回 1,因为在随后对 numberOfRowsInSection 的调用中,我希望它不会弄乱表格,只是返回说我有一个自定义单元格。

我想我想知道是否有更好的方法来解决这个问题?

4

1 回答 1

1

当 tableview 更新其显示时,您不能改变 tableview。您不需要调用 deleteRowsAtIndex 路径,除非您正在改变 tableview。您需要有一个单独的方法:一个响应事件并改变 tableview 数据的方法(可能调用 begin/endUpdates 并添加或删除行)。-numberOfRowsInSection 应该只检查支持数据并返回答案。此时 tableview 正在执行完整更新,因此在 tableview 中添加和删除行无论如何此时都是无用的。

于 2012-12-14T23:39:14.870 回答