【发布时间】:2015-03-21 16:30:31
【问题描述】:
我很擅长编写 iOS 应用程序,但 OS X 出人意料地显得有些陌生。
这是前面的问题(请继续阅读以了解上下文):
当我的应用程序使用在我的应用程序目标的部署信息下的主界面字段中设置的 .xib 启动时,为什么 AppDelegate 在 ViewControllers 之后被实例化?
上下文(没有双关语):
我问的原因是因为我正在使用 Core Data(请不要为这个决定烦恼),并且通常您会在 AppDelegate 中保留一个指向 MOC(托管对象上下文)的指针。我的一个控制器正在尝试获取此 MOC 实例变量,但 AppDelegate 实例尚未出现,因此我的应用在启动后不会显示数据。
AppDelegate 和两个 ViewController 在 .xib 中。 VC 与拆分视图中的视图挂钩。他们正在尝试使用 viewDidLoad 中的 MOC 进行查询。他们像这样访问 AppDelegate:
let delegate = NSApplication.sharedApplication().delegate as AppDelegate
let moc = delegate.managedObjectContext
当sharedApplication() 的.delegate 属性返回nil 时,这将崩溃。
我尝试从 applicationDidFinishLaunching 中的 .xib 制作一个 NSWindowController 并从 Main Interface 字段中删除 .xib,但随后根本没有调用 applicationDidFinishLaunching。
我已确保在 IB 中从应用程序和文件所有者 (NSApplcation) 委托 IBOutlets 到 AppDelegate 的所有连接都已建立。
更新 - 2015 年 3 月 31 日
Stephen Darlington 在下面的回答为我/这个案例提供了一个很好的解决方案。据我了解,实际上按照他的建议设置 MOC 会更好。
如果有一个正确答案可以解释为什么 AppDelegate 在启动过程的稍后时间被实例化,我会将其标记为正确,而不是 Stephen 的。谢谢斯蒂芬!
【问题讨论】:
-
您在哪里或如何创建 ViewControllers 的实例?视图控制器实例是否也驻留在主 nib 文件中?当你说“我的一个控制器正在尝试获取这个 MOC 实例变量但 AppDelegate 实例还没有出现”时,这个视图控制器是否有一个
IBOutlet到AppDelegate,和/或在什么方法视图控制器是否尝试访问AppDelegate(例如,init、awakeFromNib等)? -
感谢您指出宝贵的缺失信息@NSGod。我已编辑我的问题以回答您的问题。
-
在 AppDelegate 类中尝试
@NSApplicationMain尝试强制它更快地初始化委托实例? -
@stevesliva 被放置在 AppDelegate 的顶部,在 Xcode 模板的类定义之外。那是对的吗?如果是这样,问题仍然存在。
标签: objective-c macos cocoa core-data appdelegate