AppDelegate在发布时最后实例化

时间:2015-03-21 16:30:31

标签: objective-c macos cocoa core-data appdelegate

我非常适合编写iOS应用程序,但OS X出乎意料地显得有点异形。

这里提出了问题(请继续阅读上下文):

当我的应用程序使用我的应用程序目标的部署信息下的主界面字段中设置的.xib启动时,为什么AppDelegate会在ViewControllers之后实例化?


上下文(无双关语):

我问的原因是因为我使用的是核心数据(让我对这个决定毫不犹豫),通常你会在AppDelegate中保留一个指向MOC(托管对象上下文)的指针。我的一个控制器正在尝试获取此MOC实例变量,但AppDelegate实例还没有,因此我的应用程序在启动后不会显示数据。

AppDelegate和两个ViewControllers位于.xib中。 VC将连接到拆分视图内的视图。他们试图在viewDidLoad中使用MOC进行查询。他们正在这样访问AppDelegate:

let delegate = NSApplication.sharedApplication().delegate as AppDelegate
let moc = delegate.managedObjectContext

这会因.delegate的{​​{1}}属性返回nil而崩溃。

我尝试从sharedApplication()中的.xib创建一个NSWindowController并从主界面字段中删除.xib,但是applicationDidFinishLaunching根本没有被调用。

我已确保IB中的所有连接都来自应用程序和文件所有者(NSApplcation)委托IBOutlets到AppDelegate。




更新 - 2015年3月31日

斯蒂芬达林顿在下面的回答为我/本案提供了一个很好的解决方案。据我所知,以他建议的方式设置MOC实际上更好。

如果一个正确的答案到了解释为什么AppDelegate在发布过程中稍后被实例化的原因,我会将其标记为正确而不是Stephen。谢谢史蒂芬!

3 个答案:

答案 0 :(得分:1)

“简单”的解决方案是让managedObjectContext创建MOC(如果不存在)(即,将其从属性更改为方法)。那种曾经代码到达那里的方式首先是堆栈可用。

(我将在应用委托中创建核心数据堆栈以及像这样访问应用程序代理的讲座!)

答案 1 :(得分:1)

这是另一个没有必须子类化NSApplication的选项:

  • 不要将视图控制器放在您设置为主界面的.xib中,只需要有主菜单(菜单栏),AppDelegate和Font Manager。
  • 然后在其他.xibs中创建视图控制器。
  • 然后在applicationDidFinishLaunching方法中,从他们的.xib文件初始化视图控制器。

答案 2 :(得分:0)

我在设置Parse时也遇到了这个问题。为了解决这个问题,我简单地将NSApplication子类化,并将其设置为Principle class中的Info.plist。在NSApplication子类中,覆盖init方法并初始化Parse或其他任何你需要的东西。