Отключить открытую панель в запуске приложения на основе документов Cocoa

Я написал приложение на основе документов, в котором отключено автоматическое создание новых документов при запуске приложения без восстановления ранее открытого документа.

Теперь я также хотел бы отключить открытую панель, которая появляется при запуске приложения.

Открытая панель иногда запускается между 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

person xizor    schedule 18.06.2015    source источник
comment
Привет, не могли бы вы опубликовать пример кода того, как вы сейчас это делаете? Я также пытался отключить открытый документ, но это было сложно   -  person gbdavid    schedule 24.10.2015
comment
@gbdavid Я добавил решение, которое придумал.   -  person xizor    schedule 29.10.2015
comment
Спасибо! Я тоже не нашел ничего лучше, поэтому пока реализую ваше решение. Я опубликую обновление здесь, если найду что-то полезное. :)   -  person gbdavid    schedule 29.10.2015


Ответы (2)


Мне не удалось найти приемлемое встроенное решение, поэтому после небольшой отладки я нашел хорошую точку переопределения в 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 подключите пункт меню «Файл»> «Открыть» к [MyDocumentController openDocumentOverride:].


Теперь пункт меню «Файл» > «Открыть» работает, но он не сможет отображать окно «Открыть» при запуске приложения.

person xizor    schedule 28.10.2015

Следующий код в моем подклассе NSDocumentController также работает:

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