Xcode如何设置基于文档的应用程序?

时间:2011-06-26 19:09:20

标签: xcode cocoa xcode3.2

我正在学习Cocoa,通过阅读文档我的理解是,当应用程序启动时会发生以下情况:

  1. 创建共享应用程序实例。
  2. 从应用程序属性列表中查找主nib文件,以便应用程序知道要加载哪个nib。
  3. 启动运行循环。
  4. 这很好,对单个窗口应用程序有意义但是我对在创建基于文档的应用程序时xcode的作用感到困惑。

    在这种情况下,有两个nib文件;第一个包含应用程序菜单,第二个包含代表 NSDocument 子类的窗口。当我运行应用程序时,会自动打开一个新的文档窗口。

    基于我对上面概述的应用程序如何工作的理解,我不明白我的应用程序在从属性列表中查找菜单笔尖后如何知道打开文档窗口。据我所知,没有生成代码来执行此操作(除了 windowNibName 方法,但是从哪里调用?)

    有人能告诉我xcode的不同之处,以便应用程序知道它是基于文档的,因此需要打开文档窗口吗?

    更新

    我想要了解的是,如果我的应用程序设置为基于文档的应用程序而不是单个窗口应用程序,Xcode如何知道如何做一些不同的事情。据我所知,没有设置来指定这个,Xcode似乎没有生成任何代码来提供这种不同的行为。

    通过阅读过去几天的文件我认为我知道这是如何运作但不确定:

    1. _NSApplication_具有委托方法 applicationOpensUntitledFile ,由应用程序委托调用。
    2. NSDocumentController 默认设置为应用程序委托,默认实现查找是否存在 CFBundledTypeInfo 以确定文档是否基于文档,并作为响应适用于应用程序(基于文档的应用程序为IE YES,单窗口应用程序为NO)。
    3. 大多数情况下,创建单个窗口应用程序时,应用程序委托将替换为自定义 AppController ,通常不会包含 applicationOpenUntitledFile 方法的定义它不适合应用类型。
    4. 希望任何可可专家都可以确认我的理解是否正确,或者我是否正在咆哮错误的树。

3 个答案:

答案 0 :(得分:5)

创建基于文档的应用程序时,您会得到以下几点:

  • NSDocument的子类
  • 此文档的新xib文件,以及MainMenu.xib
  • Info.plist中的CFBundleDocumentTypes条目,它告诉应用程序您的NSDocument子类

当您的应用程序打开时,共享的NSDocumentController将使用CFBundleDocumentTypes信息创建一个新的无标题文档。

有关详细信息,请阅读The Document-Based Application Project Template和其他基于文档的应用程序指南。

答案 1 :(得分:0)

我认为你的权利。如果您创建非基于文档的应用程序,请在-Info.plist中添加文档类型信息,并在main.m中设置NSApplication的委托,如下所示

int main(int argc, const char * argv[])
{
    [[NSApplication sharedApplication] setDelegate:[NSDocumentController sharedDocumentController]];
    [[NSBundle mainBundle] loadNibNamed:@"MainMenu" owner:NSApp topLevelObjects:nil];
    [NSApp run];
}

该行为似乎与默认的基于文档的应用程序模板相同。

答案 2 :(得分:0)

不,你的假设不对,请看NSApplication的finishLaunching方法中GNUstep版本的实现:

NSDocumentController    *sdc;
sdc = [NSDocumentController sharedDocumentController];
if ([[sdc documentClassNames] count] > 0)
{
  didAutoreopen = [sdc _reopenAutosavedDocuments];
}

因此它会自动创建一个NSDocumentController实例。