【发布时间】:2011-06-26 19:09:19
【问题描述】:
我正在学习 Cocoa,通过阅读文档我的理解是,当应用程序启动时会发生以下情况:
- 已创建共享应用程序实例。
- 从应用程序属性列表中查找主 nib 文件,以便应用程序知道要加载哪个 nib。
- 运行循环已启动。
这很好,对单窗口应用程序有意义,但是我对创建 基于文档的应用程序时 xcode 所做的事情感到困惑。
在这种情况下,有两个 nib 文件;第一个包含应用程序菜单,第二个包含代表 NSDocument 子类的窗口。当我运行应用程序时,会自动打开一个新的文档窗口。
根据我对上述应用程序工作原理的理解,我不明白我的应用程序如何知道在从属性列表中查找菜单笔尖后打开文档窗口。据我所知,没有生成任何代码来执行此操作(除了 windowNibName 方法,但它是从哪里调用的?)
谁能告诉我 xcode 的不同之处在于应用程序知道它是基于文档的,因此需要打开一个文档窗口?
更新:
我想了解的是,如果我的应用程序设置为基于文档的应用程序而不是单个窗口应用程序,Xcode 是如何知道如何做一些不同的事情的。据我所知,没有设置来指定这一点,而且 Xcode 似乎没有生成任何代码来提供这种不同的行为。
通过阅读过去几天的文档,我认为我知道这是如何工作的,但不确定:
- _NSApplication_有一个委托方法applicationOpensUntitledFile,由应用程序委托调用。
- NSDocumentController 默认设置为应用程序委托,默认实现会查找 CFBundledTypeInfo 的存在以确定文档是否基于文档,并根据需要做出响应应用程序(即基于文档的应用程序是 YES,单窗口应用程序是 NO)。
- 大多数情况下,在创建单个窗口应用程序时,应用程序委托会被自定义 AppController 替换,该自定义AppController 通常不会包含 applicationOpenUntitledFile 方法的定义,如它不适合应用类型。
希望任何 Cocoa 专家都可以确认我的理解是否正确,或者我是否找错了树。
【问题讨论】: