Как да скриете началния прозорец при стартиране с OS X storyboards

Създавам приложение за лента на състоянието на OS X, така че искам приложението да започне скрито.

Създадох приложение „storyboard“ и първоначалният прозорец винаги се показва, дори ако „Видим при стартиране“ не е отметнато (не е отметнато по подразбиране).


Забележка: ако деактивирам „Е начален контролер“, тогава приложението стартира правилно без никакъв прозорец, но моят (вече осиротяващ) прозорец изглежда никога не се добавя към сценария:

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

Контролерът "mainWindow" не е намерен (въпреки че съм задал правилно "Storyboard ID" на Window Controller).

Така че мисля, че е по-добре да оставите „Е начален контролер“, но просто главният прозорец да бъде скрит в началото…


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 { window?.makeKeyAndOrderFront(nil) NSApplication.shared().activate(ignoringOtherApps: true)} - person Chuy47; 20.06.2017
comment
защо Apple прави нещата трудни. Беше въпрос на отметка на едно поле с XIBS. Благодаря ябълка. - person Duck; 16.07.2017

Премахнете отметката от квадратчето „Is Initial Controller“ в сценария, оставяйки приложението ви без първоначален контролер. Вашето приложение ще работи, но няма да има прозорец.

екранна снимка

person Tim Shadel    schedule 07.06.2015
comment
Някакви идеи как да покажа прозорец в този случай? Вижте stackoverflow.com/questions/31166779/ - person Michael Samoylov; 01.07.2015
comment
Използвайте това решение вместо хака по-горе, благодаря Тим - person leonardo; 31.07.2015

Премахнете отметката от "Is Initial Controller", но тогава трябва да настроите сценария и свързания с него NSWindowController ръчно.

Точният начин за това е показан в този отговор, който ще цитирам тук:

[...] във вашия AppDelegate, настройте свойство за контролера на прозореца:

@property NSWindowController *myController;

Във вашата реализация на applicationDidFinishLaunching: метод създайте препратка към Storyboard. По този начин получавате достъп до контролера на прозореца от сценария. След това единственото нещо, което остава да направите, е да покажете прозореца, като изпратите на контролера на прозореца метода 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