【问题标题】:Updating CoreData and UINavigationController stacks更新 CoreData 和 UINavigationController 堆栈
【发布时间】:2014-04-26 09:16:54
【问题描述】:

我有一个如下所示的故事板:

摘要列表 -> 递归表视图 -> 项目视图

它由导航控制器管理,最好的部分工作正常,正如我所期望的那样。我可以在摘要列表中毫无问题地编辑数据:

Summary List -> Recursive Table View -> Item View
  |
  | <- (make a change here, use beginUpdate and endUpdate)
  |
Core Data

这个位很好用...

应该发生的是,当进入项目视图时,核心数据对象会更新,然后项目视图将出现在摘要列表的下一次加载中。

但是,由于某种原因,摘要列表仍在后台刷新,我认为是因为它位于导航层次结构中,因此当我在项目视图板上更新 CoreData 对象时,我得到经典的“CoreData:错误:严重应用程序错误。在调用 -controllerDidChangeContent' 期间,从 NSFetchedResultsController 的委托中捕获了一个异常 - 通常我会通过确保调用 beginUpdate 和 endUpdate 来解决这个问题,但是如果我和 tableView 之间可能有许多表视图,我该怎么做有问题?

这个位不起作用:

Summary List -> Recursive Table View -> Item View
  |                                         |
  |                                         | > (a change here modifies the core
  |                                              data database, Summary List is
  |                                              still somehow loaded and error)
  |
Core Data

完整的错误是经典的“你做错了”:

CoreData: error: Serious application error.  An exception was
caught from the delegate of NSFetchedResultsController during a call
to -controllerDidChangeContent:
Invalid update: invalid number of rows in section 1.
The number of rows contained in an existing section after the update
(0) must be equal to the number of rows contained in that section
before the update (1), plus or minus the number of rows inserted or 
deleted from that section (0 inserted, 0 deleted) and plus or minus
the number of rows moved into or out of that section (0 moved in, 0 moved out).

【问题讨论】:

  • 能否给出错误的全文?
  • 现在添加了,不过只是普通的...
  • 细节很重要。行和节的编号和计数,以及操作的类型,都有助于诊断正在发生的事情。
  • 因此,这认为某个项目已从表格视图的第 1 部分(第二部分)中以某种方式删除。你知道这是哪一个吗?为什么一个项目会从这个部分消失?您的代码的哪些部分可能在这里负责?
  • 我知道为什么它被删除了——我不知道如何告诉屏幕外视图控制器为更新做准备。

标签: ios core-data uinavigationcontroller nsfetchedresultscontroller


【解决方案1】:

如果您以标准方式使用获取的结果控制器设置表格,我很确定表格是否在屏幕上并不重要。听起来好像正在进行一些不寻常的更新和/或您没有正确使用获取的结果控制器作为数据源。

如果您遇到问题,可以通过将获取的结果控制器的委托设置为 nil 来关闭跟踪。当视图离开屏幕时试试这个,当它回来时恢复(并重新加载表)。

请注意,您看到的异常不是,因为缺少 begin 和 endUpdates 调用。如果它们丢失,您将不会得到异常。它们正在发生,但在里面你没有插入/删除和最终行数之间的匹配。在 beginUpdates 之前,您在第 1 节中有一行,在您没有之后,并且在您不删除任何内容期间。

【讨论】:

  • 谢谢,我会按照您的建议尝试将委托设置为 nil,但是我可以明确告诉您,我没有调用 beginUpdate 和 endUpdate - 我会尝试更新问题以提供更多信息澄清
  • 如果你使用的是获取结果控制器,你真的应该使用开始和结束更新。你在 FRC 委托方法中做了什么?
  • 但我应该什么时候?初始视图控制器何时消失?
  • 所以这里有点奇怪 - 如果我在 viewDidDissapear/willAppear 中同时使用 begin/end ,那么它会中断,如果我只是在出现时使用 end 那么它可以工作:-/
  • 标记为答案,因为这肯定是让我到达那里的原因!
【解决方案2】:

您需要实现获取的结果控制器委托方法。在委托回调中,确保删除并添加适当数量的单元格和部分。那么这个错误肯定会消失。

【讨论】:

  • 不,不是那样。直接更新数据是有效的,因为我实现了开始和结束更新方法。出现问题是因为视图控制器在我更改核心数据时仍然在堆栈上处于活动状态 - 你如何告诉不活动的视图控制器你正在开始更新?
  • viewWillAppear处理。只需在视图显示之前重新加载即可。
  • 所以这里有点奇怪 - 如果我在 viewDidDissapear/willAppear 中同时使用 begin/end ,那么它会中断,如果我只是在出现时使用 end 那么它可以工作:-/
  • 不需要开始/结束。它们仅用于动画。视图不在屏幕上,因此您不需要动画。
  • 如果我没有按照我的描述执行“结束”操作,我会遇到异常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
  • 1970-01-01
  • 2012-10-29
  • 1970-01-01
  • 2012-03-07
  • 2021-06-27
相关资源
最近更新 更多