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()“等例程中,我通过模型中的”to-多“关系,通过NSSet()访问课程。(即courses_rel)。所有这些对于两个视图的初始显示都很好。
vc3也很好用。用户可以在任何选定的年份中添加新的课程。
这是我的问题。当用户通过vc3添加一个新的课程,然后切换到vc2,新的课程不会出现,我得到下面提供的错误。我知道我得到了错误,因为更改是在课程数据库表中进行的,但是vc2中的表视图是从“年份”表中加载的。它从来没有得到"didChangeObject“和其他相关的信息,因为它处理的是”年“,而不是课程。然而,每个分组部分的主体是一个课程列表!
如何在用户转到vc3时立即反映对课程表( vc2 )的更改?
我在reloadData函数中放置了一个新的fetch操作和一个视图viewWillLoad,但同样,它是年数的获取,而不是过程,所以没有任何效果。
下面是用户在添加vc2课程后切换到vc3时所遇到的错误。
CoreData:错误:严重的应用程序错误。在调用NSFetchedResultsController :时,从-controllerDidChangeContent的委托中捕获了一个异常。无效更新:第0节中的行数无效。更新(3)后包含在现有节中的行数必须等于更新(2)之前包含在该节中的行数,加上或减去从该节插入或删除的行数(0插入,0删除),加上或减去移动到或移出该节的行数(0移动,0移出)。使用userInfo (null)
发布于 2011-10-24 09:06:59
您对VC2的获取请求应该是“课程”请求,而不是“年份”请求。获取的结果控制器只会注意到更改,并在从获取请求返回的结果集发生更改时调用委托方法。添加新课程时,不会创建新的年份,因此获取的结果控制器不会传播任何更改。
假设您的课程实体具有“年度”关系,那么您可以将获取的结果控制器配置为按年分组,如下所示:
NSFetchedResultsController *myController = [[NSFetchedResultsController alloc]
initWithFetchRequest:<a courses fetch request>
managedObjectContext:context
sectionNameKeyPath:@"year"
cacheName:<cache name or nil>];
然后,修改tableview数据源方法,使用frc中的节信息创建几年的节,并用课程填充部分。如果您是这样做的,那么每当添加新的课程时,frc将通过委托方法通知vc2。
发布于 2016-09-13 21:48:08
https://stackoverflow.com/questions/7876551
复制