Как скрыть начальное окно при запуске с раскадровки 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" .
Это немедленно освободит окно и не позволит механизму загрузки раскадровки найти его, даже если у вас есть правильный идентификатор.