我对编写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
由于
.delegate
的sharedApplication()
属性返回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/