如何使用Storyboard将对象从AppDelegate传递给WindowController?

时间:2015-10-31 13:27:06

标签: objective-c cocoa nsstoryboard

在我的应用程序委托中,我创建了一个NSManagedObjectContext属性,我希望将其传递给我在applicationDidFinishLaunching:中启动的窗口控制器。

这基本上是我AppDelegate.m中的代码:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle:nil];

    self.setupWindowController = [storyboard instantiateControllerWithIdentifier:@"setup"];
    self.setupWindowController.managedObjectContext = self.managedObjectContext;

    [self.setupWindowController showWindow:self];
}

MyWindowController.m我有以下方法:

- (void)setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext {
    ((MyViewController *)self.contentViewController).managedObjectContext = managedObjectContext;
}

这是来自MyViewController.m的方法:

- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
    if ([segue.destinationController isKindOfClass:self.class]) {
        ((MyViewController *)segue.destinationController).managedObjectContext = self.managedObjectContext;
    }
}

这种方法非常有效,直到我不得不以编程方式从应用程序委托启动不同的窗口。 现在的问题是,在我能够设置prepareForSegue:sender:之前调用MyWindowController.managedObjectContext初始视图,因此它只会通过以下segue传递nil

在设置视图层次结构之前,我应该如何将对象从我的app委托传递给初始窗口控制器?

我是否以错误的方式接近这一切?

1 个答案:

答案 0 :(得分:1)

我建议通过在应用程序中创建数据模型层来减少控制器之间的依赖关系。

数据模型将管理控制器使用的信息,并在CoreData前面提供特定于应用程序的外观。数据模型对象可以是共享实例,也可以从已知对象(例如应用程序委托)请求。

这样,模型仅在需要时被引用,并且不会像传递对象那样使接口混乱。