1

我的基于文档的应用程序有一个带有“新文档”项的停靠菜单。停靠菜单是在 Interface Builder 中制作的,其项目的操作连接到“First Responder”-newDocument:

文档控制器是被NSDocumentController调用的子类DocumentController

在应用程序委托中,此代码用于防止在启动时打开无标题文档(而不是显示文档控制器的打开面板):

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {

    [(DocumentController *)[NSDocumentController sharedDocumentController] openDocument:self];
    return NO;

}

如果我现在启动我的应用程序,它将显示打开的面板而不是无标题的文档。如果我然后单击停靠菜单的“新建文档”项,则不会打开新文档。如果我单击模板主菜单中的标准文件菜单选项“新建文档”,则会打开一个新文档。

我想不出为什么会这样,你可以吗?如何让停靠菜单打开新文档?


编辑:这是一个没有 NSDocumentController 子类但仍然存在相同问题的示例项目。

4

1 回答 1

1

菜单项调用文档控制器上的 newDocument 方法。如果您单击停靠栏,您会触发 NSApplication 的东西并且它是委托的。例如,如果您有一个现有的应用程序窗口,那么您将不会在那里被调用。没有窗口会触发 applicationShouldOpenUntitledFile

在您的文档控制器中,像这样覆盖:

- (id)openUntitledDocumentAndDisplay:(BOOL)displayDocument error:(NSError *__autoreleasing *)outError {
  [self openDocument:nil]
}

如果您希望在启动后显示 openPanel,而不是响应 appdelegate(should bla bla)。如果您想在用户单击图标时触发它,请执行第二种方法

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    [(DocumentController *)[NSDocumentController sharedDocumentController] openDocument:nil];
}

- (BOOL)applicationShouldOpenUntitledFile:(NSApplication *)sender {
    return YES;
}

基于文档的应用程序中文件菜单的新建项的操作。此方法的默认实现调用 -openUntitledDocumentAndDisplay:error: 并且,如果返回 nil,则在应用程序模式面板中显示错误。

  • (IBAction)newDocument:(id)sender;
于 2015-09-01T22:43:09.783 回答