0

我一直在阅读有关此项目的大多数问题,但不知何故我无法弄清楚这一点。

我很容易将 ManagedObjectContext 从 AppDelegate 移交给我之前尝试过的应用程序中的第一个视图,其中初始 viewController 也处理数据。

现在在我正在构建的一个新应用程序中,我需要一个初始屏幕,用户需要在其中进行选择(通过几个可能的按钮)。在这个屏幕上,根据我的故障排除,我的 MOC 仍然完好无损(NSLog 消息为我提供了 MOC 的有效地址)。

做出选择后,应用程序会转到一个 UIViewController,其中包含一个 TableView。在这个视图中,我应该能够管理我的数据,但我的 MOC 返回 nil。

应用程序通过 UINavigationController 进入下一个视图。

我在我的 AppDelegate 中加入了以下代码:

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController;
InitialViewController *controller = (InitialViewController *)navigationController.topViewController;
controller.managedObjectContext = self.managedObjectContext;
return YES;

InitialViewController 是第一个 ViewController,一切都还好。

下一个视图控制器称为 MasterViewController,是 NSFetchedControllerDelegate。在这里,我似乎无法访问 NOC。我已经尝试了在同一主题的先前问题中建议的几种方法和解决方案,但似乎都没有奏效。

如何通过正确的编码让 NOC 在 MasterViewController 中工作?

哦,是的,其中一个有效的解决方案是在 MasterViewController 中的 ViewDidLoad 之后,我插入以下代码:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;

我的 MOC 现在可用,但这是正确的方法吗?

4

2 回答 2

0

如果您使用故事板,

- (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:方法。

于 2012-08-07T07:32:52.080 回答
-1

您编写“controller.managedObjectContext”,因此您清楚地将 NSManagedObjectContext* 属性添加到 InitialViewController。您只需将相同的属性添加到 MasterViewController,并将 self.managedObjectContext 也分配给它。

如果您不想将 moc 添加到每个控制器,那么简单地为您的 MOC 声明一个全局变量并没有错:

在您的 appDelegate.h 中:

extern NSManagedObjectContext* moc;

现在任何 .m 具有:

#import "AppDelegate.h"

将可以访问 moc。您也可以只向您的 appDelegate 添加一个属性,然后在每个控制器中您可以执行以下操作:

AppDelegate* app = (AppDelegate*)[[UIApplication sharedApplication] delegate];
app.managedObjectContext
于 2012-08-07T03:20:31.477 回答