1

我有一个简单的 iOS 应用程序,在 UINavigationController 下有一个 UIViewController。UIViewController 有一个用于 NSManagedObjectContext 的 IBOutlet。

AppDelegate 有一个用于导航控制器的 IBOutlet - 但不是视图控制器。视图控制器在 XIB 进程中自动实例化(作为导航控制器的子进程)。

使用此设置,如何干净地将应用程序委托的 NSManagedObjectContext 分配或传递给视图控制器的 IBOutlet 属性。有一个导航控制器:) 并且应用程序委托没有 UIViewController 的直接属性。

这是一个奇怪的问题,我想将一个 XIB 组件的属性链接到另一个组件的属性。我所做的大部分 XIB 工作都需要一个属性并将其指向 XIB 中的一个对象,而 XIB 又会在正常过程中被实例化,但在这种情况下,上下文是在应用程序委托中正确创建的,我只是想要在实例化它时将其传递给视图控制器。

4

3 回答 3

0

Apple 的文档建议您将对托管对象上下文的引用传递给需要它们的类,而不是从您的应用程序委托中引用它。

这是application:didFinishLaunchingWithOptions:我的一个核心数据项目中的样子。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{        
    LocationsViewController *lvc = (LocationsViewController *)self.navigationController.topViewController;
    lvc.managedObjectContext = self.managedObjectContext;
    assert(lvc.managedObjectContext != nil);
    [self.window addSubview:self.navigationController.view];
    [self.window makeKeyAndVisible];

    return YES;
}

你会看到我也是从一个带有单个根视图控制器的 UINavigationController 开始的。

于 2011-03-03T19:03:48.593 回答
0

你的想法是对的,但你正在努力解决的问题似乎完全是你自己创造的。您说您的应用程序委托有一个用于导航控制器的出口,但没有用于导航控制器的根视图控制器,因为您已经设置了 nib,以便在加载 nib 时创建视图控制器。这并没有错,但也没有理由应用程序委托不应该为该控制器提供出口。实际上,使用 outlet 的全部原因是获取对从 nib 加载的内容的引用。

为您的根视图控制器添加一个出口到您的应用程序委托,并连接它。然后,应用程序委托可以为控制器提供对托管对象上下文的引用。

关于您关于多个视图控制器的问题,我想知道什么样的实际应用程序可能具有需要数据的视图控制器(A),加载另一个不需要任何数据的视图控制器(B),然后是第三个(C) 哪个又需要数据?一个现实的例子可能会有所帮助,如果你有的话。

请记住,您不必将整个托管对象上下文传递给每个连续的视图控制器。相反,您可以通过传递托管对象来传递控制器完成其工作所需的模型部分。

于 2011-03-05T04:42:58.897 回答
0

您不需要传递它,只需根据需要从应用程序委托中获取它:

#import "MyAppDleegate.h"

NSManagedObjectContext* moc = [(MyAppDelegate*)[UIApplication sharedApplication].delegate managedObjectContext];
于 2011-03-03T18:42:28.767 回答