【发布时间】:2014-11-01 13:17:55
【问题描述】:
我在 Xcode6 中创建了一个使用故事板的 Cocoa 应用程序。作为模板,Xcode 为应用程序提供了一个窗口。我想添加第二个窗口来显示程序首次加载的时间。所以基本上,会出现两个窗口。
我在第一个窗口所在的 Main.storyboard 上放置了一个窗口控制器。但是,我找不到在程序启动时显示第二个窗口的方法。你能帮忙吗?
谢谢。
【问题讨论】:
标签: objective-c macos cocoa xcode6
我在 Xcode6 中创建了一个使用故事板的 Cocoa 应用程序。作为模板,Xcode 为应用程序提供了一个窗口。我想添加第二个窗口来显示程序首次加载的时间。所以基本上,会出现两个窗口。
我在第一个窗口所在的 Main.storyboard 上放置了一个窗口控制器。但是,我找不到在程序启动时显示第二个窗口的方法。你能帮忙吗?
谢谢。
【问题讨论】:
标签: objective-c macos cocoa xcode6
在您的 Storyboard 中,选择您的第二个窗口控制器。在身份检查器中,为此窗口控制器指定一个名称,例如 secondWindowController
然后,在您的应用委托中,为窗口控制器设置一个属性:
@property NSWindowController *myController;
在您的 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
【讨论】:
[storyBoard instantiateInitialController] 可以用来绕过ID问题(只要你已经设置了你想要的窗口,作为storyboard文件中的初始视图控制器。
Swift 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)
}
确保在函数外部定义myWindowController,否则窗口不会显示。
实际上最好在(AppDelegate 的)init() 中执行此操作,因为您可能更早需要它。
【讨论】:
斯威夫特 5:
XCode 13 中的项目设置已完全改变。不再有如何从 AppDelegate 连接到情节提要的示例。相反,他们正在硬编码一个 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)
【讨论】:
swift 4 版本:
var monitorcontroler: NSWindowController!
override init() {
super.init()
let mainStoryboard = NSStoryboard.init(name: NSStoryboard.Name(rawValue: "Main"), bundle: nil)
monitorcontroler = mainStoryboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "moniteur")) as! NSWindowController
monitorcontroler.showWindow(self)
}
【讨论】: