Отключить открытую панель при запуске приложения на основе документов Какао
Я написал приложение на основе документов, которое отключило автоматическое создание новых документов при запуске приложения без восстановления ранее открытого документа.
Теперь я также хотел бы отключить открытую панель, которая появляется при запуске приложения.
Открытая панель запускается иногда между applicationWillFinishLaunching:
а также applicationDidFinishLaunching:
в моем приложении делегат.
Единственный способ выяснить, как отключить эту функцию, это перезаписать [NSDocumentController openDocument:]
в подклассе, а затем создайте вспомогательный "вспомогательный" метод, который я затем подключу к меню "Файл"> "Открыть". Это похоже на очень хакерское решение, и хочется посмотреть, есть ли у кого-нибудь лучшие идеи.
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 ответа
Мне не удалось найти приемлемое встроенное решение, поэтому после небольшой отладки я нашел хорошую точку переопределения в NSDocumentController. Это очень хакерское решение, но это лучшее, что я могу придумать.
[NSDocumentController openDocument:]
это метод, который вызывается и обрабатывает загрузку открытой панели в приложениях, основанных на документе какао. Это также метод, который связан с пунктом меню Файл> Открыть. Так что два шага необходимы.
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 подключите пункт меню Файл> Открыть к [MyDocumentController openDocumentOverride:].
Теперь пункт меню "Файл"> "Открыть" работает, но он не сможет отображать поле "Открыть" при запуске приложения.
Следующий код в моем
NSDocumentController
подкласс, похоже, тоже работает:
override func runModalOpenPanel(_ openPanel: NSOpenPanel, forTypes types: [String]?) -> Int {
if !NSApp.isActive {
return 0
}
return super.runModalOpenPanel(openPanel, forTypes: types)
}