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

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

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


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

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

Контроллер «mainWindow» не найден (хотя я правильно установил «ID раскадровки» в оконном контроллере).

Поэтому я думаю, что лучше оставить «Исходный контроллер», а просто скрыть главное окно в начале…


person Matthieu Napoli    schedule 17.01.2015    source источник
comment
Простите меня за ответ на вопрос более 1 года назад, но окно можно создать из раскадровки, даже если вы не установите его в качестве начального контроллера представления. Возможно, вы не держите экземпляр окна или оконного контроллера, я думаю.   -  person Blaszard    schedule 04.03.2016


Ответы (4)


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

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)
person kmikael    schedule 18.01.2015
comment
Это сработало для меня, но мне пришлось показать окно внутри блока операции, потому что оно вообще не показывалось. OperationQueue.main.addOperation {окно?.makeKeyAndOrderFront(nil) NSApplication.shared().activate(ignoringOtherApps: true)} - person Chuy47; 20.06.2017
comment
почему Apple все усложняет. Это был вопрос проверки одной коробки с XIBS. Спасибо яблоко. - person Duck; 16.07.2017

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

скриншот

person Tim Shadel    schedule 07.06.2015
comment
Любые идеи, как отобразить окно в этом случае? См. stackoverflow.com/questions/31166779/ - person Michael Samoylov; 01.07.2015
comment
Используйте это решение вместо хака выше, спасибо, Тим. - person leonardo; 31.07.2015

Снимите флажок «Исходный контроллер», но тогда вам нужно вручную установить раскадровку и связанный с ней 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
person adfernandes    schedule 06.08.2015

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

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)`

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

person Thomas Krajacic    schedule 17.11.2015