如何在OS X故事板的开头隐藏初始窗口

时间:2015-01-17 11:52:25

标签: macos cocoa swift uistoryboard

我正在创建一个OS X状态栏应用程序,所以我希望应用程序开始隐藏

我创建了一个“故事板”应用程序,即使未选中“在启动时可见”(默认情况下未选中),初始窗口也会显示出来。


注意:如果我禁用“是初始控制器”,那么应用程序会在没有任何窗口的情况下正确启动,但我的(现在的孤儿)窗口似乎永远不会添加到故事板中:

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

找不到“mainWindow”控制器(即使我在Window Controller上正确设置了“Storyboard ID”)。

所以我认为离开“是初始控制器”更好,但只是在开始时隐藏主窗口......

4 个答案:

答案 0 :(得分:29)

取消选中"是否是初始控制器"故事板上的框,离开您的应用程序没有初始控制器。您的应用将会运行,但没有窗口。

screenshot

答案 1 :(得分:10)

这可能有点黑客,但你可以这样做

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 :(得分:6)

取消选中“Is Initial Controller”,但是您需要手动设置故事板及其关联的NSWindowController

这样做的确切方法显示为in this answer,我将在此引用:

  

[...]在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

答案 3 :(得分:0)

这样做的方法就像你尝试过的那样:

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

你唯一可能忘记的是取消选中"关闭时释放" 。 即使你有正确的标识符,这也会立即释放窗口并阻止故事板加载机制找到它。