Как скрыть начальное окно при запуске с раскадровки OS X

Я создаю приложение состояния OS X, поэтому я хочу, чтобы приложение запустилось.

Я создал приложение "раскадровки", и начальное окно всегда отображается, даже если "Видимый при запуске" не установлен (по умолчанию он не отмечен).


Примечание: если я отключу "Исходный контроллер", приложение правильно запускается без какого-либо окна, но мое (теперь сиротское) окно никогда не добавляется в раскадровку:

var mainWindow = NSStoryboard(name: "Main", bundle: nil)?.instantiateControllerWithIdentifier("mainWindow")

Контроллер "mainWindow" не найден (даже если я правильно установил "Идентификатор раскадровки" в Window Controller).

Итак, я думаю, что лучше оставить "Является начальным контроллером", но просто просто скрыть главное окно в начале...

Ответ 1

Это может быть немного взломать, но вы можете сделать это

func applicationDidFinishLaunching(notification: NSNotification) {
    // Insert code here to initialize your application
    NSApplication.sharedApplication().windows.last!.close()
}

И затем позже...

NSApplication.sharedApplication().windows.last!.makeKeyAndOrderFront(nil)
NSApplication.sharedApplication().activateIgnoringOtherApps(true)

Ответ 2

Снимите флажок "Исходный контроллер" на раскадровке, оставив приложение без начального контроллера. Ваше приложение запустится, но не будет окна.

screenshot

Ответ 3

Снимите флажок "Исходный контроллер", но тогда вам нужно вручную установить раскадровку и связанные с ней NSWindowController.

Точный способ сделать это показан в этом ответе, который я приведу здесь:

[...] в вашем AppDelegate, настройте свойство для оконного контроллера:

@property NSWindowController *myController;

В вашей реализации метода applicationDidFinishLaunching: создайте ссылку на раскадровку. Таким образом вы получаете доступ к вашему оконному контроллеру из раскадровки. После этого осталось только отобразить окно, отправив вашему оконному контроллеру метод showWindow:.

#import "AppDelegate.h"

@interface AppDelegate ()
@end

@implementation AppDelegate

@synthesize myController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    // get a reference to the storyboard
    NSStoryboard *storyBoard = [NSStoryboard storyboardWithName:@"Main" bundle:nil]; 
    // instantiate your window controller 
    myController = [storyBoard instantiateControllerWithIdentifier:@"secondWindowController"];
    // show the window
    [myController showWindow:self];
}

@end

Ответ 4

Способ сделать это так же, как вы пробовали:

let storyboard = NSStoryboard(name: "Main", bundle: nil)
guard let mainWC = storyboard.instantiateControllerWithIdentifier("MainWindowController") as? MainWindowController else {
   fatalError("Error getting main window controller")
}
// optionally store the reference here
self.mainWindowController = mainWC

mainWC.window?.makeKeyAndOrderFront(nil) // or use `.showWindow(self)`

Единственное, что вы, наверное, забыли, это снять флажок "Release when closed" . Это немедленно освободит окно и не позволит механизму загрузки раскадровки найти его, даже если у вас есть правильный идентификатор.