我正在学习Cocoa,通过阅读文档我的理解是,当应用程序启动时会发生以下情况:
这很好,对单个窗口应用程序有意义但是我对在创建基于文档的应用程序时xcode的作用感到困惑。
在这种情况下,有两个nib文件;第一个包含应用程序菜单,第二个包含代表 NSDocument 子类的窗口。当我运行应用程序时,会自动打开一个新的文档窗口。
基于我对上面概述的应用程序如何工作的理解,我不明白我的应用程序在从属性列表中查找菜单笔尖后如何知道打开文档窗口。据我所知,没有生成代码来执行此操作(除了 windowNibName 方法,但是从哪里调用?)
有人能告诉我xcode的不同之处,以便应用程序知道它是基于文档的,因此需要打开文档窗口吗?
更新
我想要了解的是,如果我的应用程序设置为基于文档的应用程序而不是单个窗口应用程序,Xcode如何知道如何做一些不同的事情。据我所知,没有设置来指定这个,Xcode似乎没有生成任何代码来提供这种不同的行为。
通过阅读过去几天的文件我认为我知道这是如何运作但不确定:
希望任何可可专家都可以确认我的理解是否正确,或者我是否正在咆哮错误的树。
答案 0 :(得分:5)
创建基于文档的应用程序时,您会得到以下几点:
当您的应用程序打开时,共享的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实例。