我对编写iOS应用程序非常满意,但是OS X似乎有些陌生。

这是预先的问题(有关上下文,请继续阅读):

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



上下文(无双关语):

我问的原因是因为我正在使用Core Data(不做任何决定),并且通常在AppDelegate中保留一个指向MOC(托管对象上下文)的指针。我的一个控制器正在尝试获取此MOC实例变量,但AppDelegate实例尚不存在,因此我的应用程序启动后就不会显示数据。

AppDelegate和两个ViewController位于.xib中。 VC挂钩到拆分视图中的视图。他们试图在viewDidLoad中使用MOC进行查询。他们正在像这样访问AppDelegate:

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


由于.delegatesharedApplication()属性返回nil,这将崩溃。

我尝试从applicationDidFinishLaunching中的.xib制作一个NSWindowController并从Main Interface字段中删除.xib,但是随后applicationDidFinishLaunching根本没有被调用。

我确保从应用程序和文件所有者(NSApplcation)委托IBOutlet到AppDelegate的IB中的所有连接均已建立。





更新-31/03/15

斯蒂芬·达林顿(Stephen Darlington)在下面的回答为我/本案提供了一个很好的解决方案。据我了解,按照他的建议设置MOC实际上更好。

如果到达正确答案,解释了为什么在启动过程中稍后某个时间实例化AppDelegate的原因,我将其标记为正确,而不是Stephen的。谢谢斯蒂芬!

最佳答案

“简便”的解决方案是让managedObjectContext创建一个不存在的MOC(即,将其从属性更改为方法)。这样,无论哪个代码首先到达那里,堆栈都将可用。

(我将保留关于在应用程序委托中创建Core Data堆栈以及像这样访问应用程序委托的讲座!)

关于objective-c - AppDelegate在启动时最后实例化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29185106/

10-13 23:58