使用OS X的故事板初始化另一个窗口

Hak*_*kan 23 macos cocoa objective-c xcode6

我在Xcode6中创建了一个使用故事板的Cocoa应用程序.作为模板,Xcode为应用程序提供了一个窗口.我想添加第二个窗口来显示程序首次加载的时间.基本上,会出现两个窗口.

我在Main.storyboard上放了一个窗口控制器,第一个窗口也在这里.但是,当程序启动时,我找不到显示第二个窗口的方法.能否请你帮忙?

谢谢.

sut*_*tie 36

在Storyboard中,选择第二个Window Controller.在身份检查器中,为此窗口控制器指定名称,例如secondWindowController

然后,在您的app委托中,为窗口控制器设置一个属性:

@property NSWindowController *myController;
Run Code Online (Sandbox Code Playgroud)

在您的applicationDidFinishLaunching:方法实现中,创建对Storyboard的引用.这样您就可以从故事板访问窗口控制器.之后,剩下要做的就是通过向窗口控制器发送showWindow:方法来显示窗口.

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate
@synthesize myController;

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
NSStoryboard *storyBoard = [NSStoryboard storyboardWithName:@"Main" bundle:nil]; // get a reference to the storyboard
myController = [storyBoard instantiateControllerWithIdentifier:@"secondWindowController"]; // instantiate your window controller
[myController showWindow:self]; // show the window
}

@end
Run Code Online (Sandbox Code Playgroud)


Sam*_*Sam 6

斯威夫特 3 版本:

var myWindowController: NSWindowController!

override init() {
    super.init()

    let mainStoryboard = NSStoryboard.init(name: "Main", bundle: nil)
    myWindowController = mainStoryboard.instantiateController(withIdentifier: "myWindowControllerStoryboardIdentifier") as! NSWindowController
    myWindowController.showWindow(self)
}
Run Code Online (Sandbox Code Playgroud)

确保myWindowController在函数外定义,否则窗口不会显示。

实际上最好在 init()(AppDelegate 的)中执行此操作,因为您可能更早需要它。


Hou*_*man 5

斯威夫特5:

XCode 13 中的项目设置已完全改变。不再有如何从 AppDelegate 连接到 Storyboard 的示例。相反,他们对 NSWindow 进行硬编码。我仍然发现故事板很有用,因此下面的内容应该会派上用场。请记住将 Storyboard 中的 WindowController 命名为mainWindowController

let mainStoryboard = NSStoryboard.init(name: NSStoryboard.Name("Main"), bundle: nil)
var monitorcontroler = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("mainWindowController")) as! NSWindowController
monitorcontroler.showWindow(self)
Run Code Online (Sandbox Code Playgroud)