在基于 Cocoa 文档的应用程序启动中禁用打开面板
Posted
技术标签:
【中文标题】在基于 Cocoa 文档的应用程序启动中禁用打开面板【英文标题】:Disable Open Panel in Cocoa Document Based App Launch 【发布时间】:2015-06-18 11:46:18 【问题描述】:我编写了一个基于文档的应用程序,它在应用程序启动时禁用了新文档的自动创建,而不恢复以前打开的文档。
现在我还想禁用应用启动时出现的打开面板。
在我的应用委托中,有时会在 applicationWillFinishLaunching:
和 applicationDidFinishLaunching:
之间启动打开的面板。
我可以弄清楚如何禁用此功能的唯一方法是覆盖子类中的[NSDocumentController openDocument:]
,然后创建一个辅助“帮助器”方法,然后我将连接到“文件”>“打开”菜单。这似乎是一个非常 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
【问题讨论】:
您好,您能否发布一些示例代码来说明您目前是如何执行此操作的?我也尝试过禁用打开的文档,但这很棘手 @gbdavid 我已经添加了我想出的解决方案。 谢谢!我也没有找到更好的方法,所以我现在将实施您的解决方案。如果我发现有用的东西,我会在这里发布更新。 :) 【参考方案1】:我无法找到可接受的内置解决方案,因此经过一些调试后,我最终在 NSDocumentController 中找到了一个好的覆盖点。这是一个非常老套的解决方案——但这是我能想到的最好的解决方案。
[NSDocumentController openDocument:]
是在 Cocoa 基于文档的应用程序中调用并处理打开面板加载的方法。这也是连接到文件 > 打开菜单项的方法。所以需要两个步骤。
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:]。
现在“文件”>“打开”菜单项可以使用,但它无法在应用启动时显示“打开”框。
【讨论】:
【参考方案2】:NSDocumentController
子类中的以下代码似乎也可以正常工作:
override func runModalOpenPanel(_ openPanel: NSOpenPanel, forTypes types: [String]?) -> Int
if !NSApp.isActive
return 0
return super.runModalOpenPanel(openPanel, forTypes: types)
【讨论】:
以上是关于在基于 Cocoa 文档的应用程序启动中禁用打开面板的主要内容,如果未能解决你的问题,请参考以下文章
OS X Cocoa:基于 NSDocument 的应用程序未保存