0
         appdelegate
     passes modelview 
     to each tab controller
            |
            |
          /    \
         /      \   
        /        \
       /          \ 
      /            \
     /              \
    vc1             vc2
 show list      show grouped  
 of years     table with years
    |          as headers and
    |           courses within
   vc3            each year
list courses
in selected 
year
   |
   |
add new 
course to
selected 
year

在 vc1 和 vc2 中,我从核心数据模型中读取的实体都是“年”。在“numberOfRowsInSection()”等例程中,我通过模型中的“对多”关系通过 NSSet() 访问课程。(即课程_rel)。所有这些都适用于两个视图的初始显示。

vc3 也很好用。用户可以将新课程添加到任何选定的年份。

这是我的问题。当用户通过 vc3 添加新课程,然后切换到 vc2 时,新课程不显示,我收到下面提供的错误。我知道我收到了错误,因为更改是在课程数据库表中进行的,但是 vc2 中的表视图是从“年”表中加载的。它永远不会收到“didChangeObject”和其他相关消息,因为它处理的是“年”而不是课程。但是,每个分组部分的正文是课程列表!

当用户转到 vc2 时,如何立即反映课程表 (vc3) 的更改?

我在 viewWillLoad 函数中放置了一个新的 fetch 操作和一个 [view reloadData] 但同样,它是几年而不是课程,所以它没有效果。

这是用户在 vc3 中添加课程后切换到 vc2 时遇到的错误。

CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。无效更新:第 0 节中的行数无效。更新后现有节中包含的行数 (3) 必须等于更新前该节中包含的行数 (2),加上或减去数字从该部分插入或删除的行数(0 插入,0 删除)加上或减去移入或移出该部分的行数(0 移入,0 移出)。与用户信息(空)

4

2 回答 2

1

您对 VC2 的获取请求应该是“课程”请求而不是“年”请求。如果从其获取请求返回的结果集发生更改,获取的结果控制器将仅注意到更改并调用您的委托方法。添加新课程时,不会创建新年份,因此获取的结果控制器不会传播任何更改。

假设您的课程实体具有“年份”关系,那么您可以将获取的结果控制器配置为按年份分组,如下所示:

 NSFetchedResultsController *myController = [[NSFetchedResultsController alloc] 
                                 initWithFetchRequest:<a courses fetch request> 
                                 managedObjectContext:context
                                   sectionNameKeyPath:@"year"
                                            cacheName:<cache name or nil>];

然后更改您的 tableview 数据源方法以使用来自 frc 的部分信息来创建多年的部分并用课程填充这些部分。如果您这样做,那么每当添加新课程时,frc 都会通过委托方法通知 vc2。

于 2011-10-24T17:06:59.590 回答
0

我从 Core Data 收到了相同的错误消息,但这就是解决方案。

https://developer.apple.com/library/content/releasenotes/iPhone/NSFetchedResultsChangeMoveReportedAsNSFetchedResultsChangeUpdate/

于 2016-09-14T05:48:08.337 回答