我正在创建一个OS X状态栏应用程序,所以我希望应用程序开始隐藏。
我创建了一个“故事板”应用程序,即使未选中“在启动时可见”(默认情况下未选中),初始窗口也会显示出来。
注意:如果我禁用“是初始控制器”,那么应用程序会在没有任何窗口的情况下正确启动,但我的(现在的孤儿)窗口似乎永远不会添加到故事板中:
var mainWindow = NSStoryboard(name: "Main", bundle: nil)?.instantiateControllerWithIdentifier("mainWindow")
找不到“mainWindow”控制器(即使我在Window Controller上正确设置了“Storyboard ID”)。
所以我认为离开“是初始控制器”更好,但只是在开始时隐藏主窗口......
答案 0 :(得分:29)
取消选中"是否是初始控制器"故事板上的框,离开您的应用程序没有初始控制器。您的应用将会运行,但没有窗口。
答案 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)`
你唯一可能忘记的是取消选中"关闭时释放" 。 即使你有正确的标识符,这也会立即释放窗口并阻止故事板加载机制找到它。