在基于Cocoa文档的应用程序启动中禁用打开面板

时间:2015-06-18 11:46:19

标签: objective-c macos cocoa document-based nsdocumentcontroller

我编写了一个基于文档的应用程序,该应用程序在应用程序启动时禁用了自动创建新文档,而无需恢复以前打开的文档。

现在,我还要禁用应用启动时显示的打开面板。

我的应用代表中有时会在applicationWillFinishLaunching:applicationDidFinishLaunching:之间启动开放式面板。

我能弄清楚如何禁用此功能的唯一方法是覆盖子类中的[NSDocumentController openDocument:],然后创建一个辅助“帮助”方法,然后我将连接到File> Open菜单。这似乎是一个非常hacky的解决方案,想看看是否有人有更好的想法。

1   Core Animator                       0x0000000100042121 -[NSDocumentController openDocument:] + 49
2   AppKit                              0x00007fff8772ffe6 -[NSDocumentController(NSInternal) _showOpenPanel] + 63
3   AppKit                              0x00007fff87244184 -[NSApplication _doOpenUntitled] + 290
4   AppKit                              0x00007fff87243c91 __58-[NSApplication(NSAppleEventHandling) _handleAEOpenEvent:]_block_invoke + 252
5   AppKit                              0x00007fff87243a59 __97-[NSDocumentController(NSInternal) _autoreopenDocumentsIgnoringExpendable:withCompletionHandler:]_block_invoke_3 + 140
6   AppKit                              0x00007fff872435a1 -[NSDocumentController(NSInternal) _autoreopenDocumentsIgnoringExpendable:withCompletionHandler:] + 798
7   AppKit                              0x00007fff87241cc6 -[NSApplication _reopenWindowsAsNecessaryIncludingRestorableState:registeringAsReady:completionHandler:] + 331
8   AppKit                              0x00007fff87241a49 -[NSApplication(NSAppleEventHandling) _handleAEOpenEvent:] + 561
9   AppKit                              0x00007fff87241495 -[NSApplication(NSAppleEventHandling) _handleCoreEvent:withReplyEvent:] + 244

2 个答案:

答案 0 :(得分:0)

我无法找到可接受的内置解决方案,所以经过一些调试后我最终在NSDocumentController中找到了一个很好的覆盖点。这是一个非常讨厌的解决方案 - 但它是我能想到的最好的。

[NSDocumentController openDocument:]是调用此方法并处理基于Cocoa文档的应用程序中的Open Panel加载的方法。这也是连接到文件>的方法。打开菜单项。所以需要两个步骤。

1。)创建一个NSDocumentController子类并覆盖打开的文档。

@interface MyDocumentController : NSDocumentController

/// Connected to File>Open menu item in replacement of openDocument:.
/// openDocument: is called sometimes at app launch to present user with open window.
/// This has been disabled by overriding openDocument:
/// This method is now used in the Main Menu to replace it
- (IBAction)openDocumentOverride:(id)sender;

@end

#import "MyDocumentController.h"

@implementation MyDocumentController

// New method to replace openDocument: in File>Open menu item.
- (IBAction)openDocumentOverride:(id)sender {
    [super openDocument:sender];
}

// Override method to prevent call on app open
- (IBAction)openDocument:(id)sender {}

@end

2.)然后在MainMenu.xib中将File> Open菜单项连接到[MyDocumentController openDocumentOverride:]。

现在文件>打开菜单项有效,但无法在应用启动时显示“打开”框。

答案 1 :(得分:0)

我的 NSDocumentController 子类中的以下代码似乎也能正常工作:

override func runModalOpenPanel(_ openPanel: NSOpenPanel, forTypes types: [String]?) -> Int {
    if !NSApp.isActive {
        return 0
    }
    return super.runModalOpenPanel(openPanel, forTypes: types)
}