我已经编写了一个基于文档的应用程序,它在应用程序启动时禁用了新文档的自动创建,而没有恢复以前打开的文档。
现在,我还想禁用在应用程序启动时出现的打开面板。
开放面板有时是在我的应用程序委托的applicationWillFinishLaunching:和applicationDidFinishLaunching:之间启动的。
我想知道如何禁用这个功能的唯一方法是在子类中覆盖[NSDocumentController openDocument:],然后创建一个次要的‘助手’方法,然后连接到File>Open菜单。这似乎是一个非常棘手的解决方案,并想看看是否有人有更好的想法。
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发布于 2015-10-28 21:36:39
我无法找到一个可接受的内置解决方案,因此经过一些调试,我最终在NSDocumentController中找到了一个很好的覆盖点。这是一个非常棘手的解决方案--但这是我能想到的最好的解决方案。
[NSDocumentController openDocument:]是在基于Cocoa文档的应用程序中调用并处理Open加载的方法。这也是连接到File > Open菜单项的方法。所以有两个步骤是必要的。
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 {}
@end2.)然后在MainMenu.xib中将File>Open菜单项连接到MyDocumentController openDocumentOverride:。
现在,“文件”>“打开”菜单项可以工作,但它无法在应用程序启动时显示“打开”框。
发布于 2021-02-02 12:34:54
我的NSDocumentController子类中的以下代码似乎也能工作:
override func runModalOpenPanel(_ openPanel: NSOpenPanel, forTypes types: [String]?) -> Int {
if !NSApp.isActive {
return 0
}
return super.runModalOpenPanel(openPanel, forTypes: types)
}https://stackoverflow.com/questions/30914489
复制相似问题