在 numberOfRowsInSection 中调用 TableView BeginUpdates

Posted

技术标签:

【中文标题】在 numberOfRowsInSection 中调用 TableView BeginUpdates【英文标题】:Calling TableView BeginUpdates in numberOfRowsInSection 【发布时间】:2012-12-14 23:30:44 【问题描述】:

我有一个由 NSFectchedResultsController 支持的 tableview,当我没有来自 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 的调用中,我希望它不会弄乱表格,只是返回说我有一个自定义单元格。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

你实际上可以改变它。不久前我有一些非常笨拙的代码,并且插入和删除在某些情况下有效。我应该这样做吗?可能不是。我会研究你的建议。我想我只需要摆脱做我想做的事的心态 不要直接在“numberRowsInSection”中添加或删除单元格。充其量你是在玩火。在 numberOfRowsInSection 期间随意改变模型,但是当您直接在之后获取 cellForRowAtIndexPath: 方法时,您返回的数字将用作最大索引。 MVC 规定您应该改变模型以响应事件,然后告诉视图它需要更新。您不应该在视图更新期间改变模型。 完全明白。您能否为我指明一个方向,以了解有关视图更新周期的更多信息(例如以哪种顺序调用哪些方法?)。基本上听起来我需要听更新完成,根据需要修改表,这将创建我自己的更新。那我应该好吗? 这里:developer.apple.com/library/ios/#documentation/UserExperience/…

以上是关于在 numberOfRowsInSection 中调用 TableView BeginUpdates的主要内容,如果未能解决你的问题,请参考以下文章

numberOfRowsInSection:未在 reloadData 上调用

ReloadData 不会触发 tableView:numberOfRowsInSection:

动态 NumberOfRowsInSection

数组未与 tableView(numberOfRowsInSection) 方法连接

在苹果的 MultipleDetailViews 示例中调用 numberOfRowsInSection 但未调用 cellForRowAtIndexPath

为啥在我的应用程序中使用 numberOfRowsInSection 会导致永无止境的循环?