【问题标题】:Core Data: delay calling endUpdates till viewWillAppear核心数据:延迟调用 endUpdates 直到 viewWillAppear
【发布时间】:2011-07-07 19:40:05
【问题描述】:

我有一个带有标签栏控制器的 Core Data 应用程序,它显示 2 个视图控制器。如果我在第一个选项卡的视图控制器中添加一些东西,它应该显示在第二个选项卡的 VC 中。两个 VC 都基于基于同一实体的 NSFetchedResultsController;唯一的区别是一个有谓词而第二个 VC 没有。

这适用于普通模板,当从第一个 VC 添加数据时,它会在第二个选项卡中使用 controllerWillChangeContent 和 controllerDidChangeContent 立即更新。问题是,如果用户在第一个 VC 中添加或删除任何行,当用户来到第二个选项卡时,他们看不到动态插入或删除的行......一切都已经存在了。

在第二个选项卡的 VC 中,我想做的是延迟调用 [self.tableView endUpdates](这会导致表中的行的动画插入/删除),直到用户实际转到该选项卡,在那个VC的viewWillAppear。我试过了,但似乎不起作用:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
        tableviewUpdates = TRUE;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    if (tableviewUpdates) {
        tableviewUpdates = FALSE;
        [self.tableView endUpdates];
    }
}

如果一次添加一行然后切换到第二个选项卡,则此方法有效,但如果我在第一个选项卡中添加多行然后切换,则无效。 任何帮助,将不胜感激。

【问题讨论】:

    标签: ios4 core-data nsfetchedresultscontroller


    【解决方案1】:

    您正在违背 NSFetchedResultsController 的目的,即自动且轻松地更新 tableview。

    但是,我很确定,如果您覆盖所有 FRC 委托方法,您可以阻止所有自动更新。

    您可能需要重新考虑此设计。用户真的会期望看到一个视图的变化在一秒钟内重新制定吗?他们会明白他们正在观看之前更改的回放,还是会直觉地认为该应用程序正在对他们的数据做一些事情?

    标准的 UI 语法让用户期望一个更改会产生一次动画,然后会在标准显示中显示出来。我建议你在部署这样一个非标准接口之前,用天真的用户仔细测试这个设计。

    【讨论】:

    • 感谢您的反馈。我不知道......我觉得如果用户在 VC1 中进行了一堆更改,然后转到 VC2,他们就会失去这些更改发生位置的所有上下文。由于它是基于日期的,所有更改都可以在 VC2 中交错,如果它没有动画,他们将不会看到他们最近的更改,因为它们适合列表。使用动画,更容易为用户提供上下文。
    • 您的决定可能有正当理由,但请小心。我能想到的一个问题是,如果用户在 VC1 中进行大量更改,当他们切换到 VC2 时,他们将不得不等待动画完成才能执行任何操作。在我的用户测试中,用户注意到任何超过 2 秒的延迟,并开始认为应用程序运行缓慢甚至挂起 5 秒。为了有用,您必须让动画运行得足够慢,以便用户可以跟踪它们,但如果动画有很多变化,这将变得乏味。
    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2012-07-28
    • 1970-01-01
    相关资源
    最近更新 更多