我一直在阅读关于这个项目的大多数问题,但不知怎的,我无法想出这个问题。
我轻松地将ManagedObjectContext从AppDelegate移交给我尝试的先前应用程序中的第一个视图,其中初始viewController也处理了数据。
现在在我正在构建的新应用程序中,我需要一个初始屏幕,用户需要进行选择(通过几个可能的按钮)。在这个屏幕上,根据我的故障排除,我的MOC仍然完好无损(NSLog消息为我提供了MOC的有效地址)。
选择完成后,应用程序将继续执行带有TableView的UIViewController。在这个视图中,我应该能够管理我的数据,但我的MOC返回nil。
应用程序通过UINavigationController进入下一个视图。
我在AppDelegate中加入了以下代码:
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
InitialViewController *controller = (InitialViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;
InitialViewController是FIRST ViewController,一切都还可以。
下一个viewcontroller被称为MasterViewController,是NSFetchedControllerDelegate。在这里,我似乎无法访问NOC。我已经尝试过在同一主题的先前问题中提出的几种方法和解决方案,但似乎都没有。
如何使用正确的编码让NOC在MasterViewController中工作?
哦,是的,其中一个解决方案是在MasterViewController中的ViewDidLoad之后,我插入以下代码:
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
我的MOC现已上市,但这是正确的方法吗?
答案 0 :(得分:0)
如果您使用的是Storyboard,
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
[super prepareForSegue:segue sender:sender];
if ([[segue identifier] isEqualToString:@"segueNameOfPresentingYourModalViewController"] == YES) {
UINavigationController *navigationController = segue.destinationViewController;
YourCustomViewController *aController = (YourCustomViewController *)navigationController.topViewController;
aController.managedObjectContext = self.managedObjectContext;
}
else if ([segue.identifier isEqualToString:@"segueNameOfPushingYourViewController"] == YES) {
YourCustomViewController *aController = segue.destinationViewController;
aController.managedObjectContext = self.managedObjectContext;
}
}
如果您没有使用Storyboard,则类似地设置视图控制器的managedObjectContext,您将在其中推送或呈现它。另一个常见的地方是-tableView:didSelectRowAtIndexPath:
方法。
答案 1 :(得分:-1)
你写" controller.managedObjectContext"所以你清楚地向InitialViewController添加了一个NSManagedObjectContext *属性。您只需要向MasterViewController添加相同的属性,并为其分配self.managedObjectContext。
如果您不想将moc添加到每个控制器,那么简单地为您的MOC声明一个全局变量没有错:
在appDelegate.h中:
extern NSManagedObjectContext* moc;
现在任何.m都有:
#import "AppDelegate.h"
可以访问moc。您也可以只在appDelegate中添加一个属性,然后在每个控制器中添加:
AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
app.managedObjectContext