1。从两个视图中使用相同Core Data上下文的最佳方法是什么?
我有一个带有两个ViewController的TabBarController。在第一个我想记录一个时间,应该存储。在第二个中有一个显示所有记录的TableView。我按照教程中的说法做了,并在App Delegate中启动了所有ManagedDataContext内容并将其传递给我的Controller:
- (void)applicationDidFinishLaunching:(UIApplication *)application {
SecondViewController *tableController = [[SecondViewController alloc] init];
tableController.managedObjectContext = [self managedObjectContext];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:tableController];
[window addSubview: [self.navigationController view]];
[window makeKeyAndVisible];
}
但是当我多次使用这个变量时(也在同一个类中)我得到一个(某种nullpointer)错误:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+entityForName: nil is not a legal NSManagedObjectContext parameter searching for entity name 'Event''
调试时我发现这里的managedObjectContext为null:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
这是什么问题?什么是观点的最佳解决方案?
是否可以使用单身人士?
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
NSLog(@"managedObjectContext already in use. Returning instance.");
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
NSLog(@"managedObjectContext nil. Returning new instance.");
return managedObjectContext;
}
2。是否可以存储与数据模型不同的对象?
我需要我的班级不要存储我的其他物品。就像一个我不想保存的数组。这可能吗?
答案 0 :(得分:2)
1。 您正在使用tabbarcontroller。该标签栏上的viewControllers需要具有属性,例如managedObjectContext。 如果您通过storyboard或nib使用tabbarcontroller,可以通过tabbarcontroller上的viewControllers属性获取viewControllers并设置managedObjectContext:
UITabBarController * tabBarController = (UITabBarController *) self.window.rootViewController;
// the first tab is a navcontroller, which contains as a rootVC a custom VC with a property for the MOC
UINavigationController * navController = (UINavigationController *)[tabBarController.viewControllers objectAtIndex:0];
MyViewController1 * rootVCOfNavController = (MyViewController1 *) [[historyNavigationController viewControllers] objectAtIndex: 0];
// the second tab of the tabbarcontroller is a custom VC with a MOC property
MyViewController2 * viewController2 = (MyViewController2 *)[tabBarController.viewControllers objectAtIndex:1];
viewController1 = self.managedObjectContext;
rootVCOfNavController.managedObjectContext = self.managedObjectContext;
这将确保第一个'裸'viewController获得MOC,以及嵌入在NavigationController中的那个。 这应该照顾第一个错误。你需要很好地理解你的viewController层次结构(注意:viewController层次结构不等于视图层次结构)。
在这种情况下,使用单身人士可以解决您不完全理解的问题,因此也是不明智的。有些情况下单身人士会很完美,但现在你的appDelegate可以很好地履行这个角色。
2。 我不清楚你在这里的意思。未在数据模型中定义的对象无法存储在核心数据中。但是,您可以将对象保存在不同的模型中(使用自己的核心数据堆栈)。或者以其他方式坚持他们。但我想你的意思是别的。 假设您的意思是您有一些无需保存的managedOjects'Class',您可以创建一个辅助MOC,而不是保存它。您还可以将其设置为原始MOC的子级,因此它将获取原始mod的持久存储中存在的所有数据,但新对象将仅存在于子MOC中。保存子MOC会将新对象移动到原始MOC中,并保存该对象将其保留在磁盘上。 同样,我不确切地知道你对第二个问题的意思。