从 NSViewController 在 OS X 上加载笔尖

Loading nib on OS X from NSViewController

我正在尝试从 OS X 上的 NSViewController 加载 NSWindow,我正在执行以下操作:

private lazy var discoverable: DiscoverableWindow = {
     return DiscoverableWindow.instanceFromNib()
} ()

静态方法instanceFromNib()定义如下:

class func instanceFromNib() -> DiscoverableWindow {
    var instance = DiscoverableWindow()
    var objects: NSArray?
    NSBundle.mainBundle().loadNibNamed("DiscoverableWindow", owner: instance, topLevelObjects: &objects)
    return instance
}

我正在使用 window 显示我的 NSViewController:

    NSApp.beginSheet(self.discoverable, modalForWindow: NSApplication.sharedApplication().mainWindow!, modalDelegate: nil, didEndSelector: nil, contextInfo: nil)

但是,当我加载它时,我看到以下内容:

我是不是做错了什么?为什么 NSWindow 是空白的?我阅读了以下内容:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Extensions.html

Cocoa - loadNibNamed:owner:topLevelObjects: from loaded bundle

Cocoa: NSApp beginSheet sets the application delegate?

你为什么不制作一个 window 控制器来处理 DiscoverableWindow

创建 NSWindowController 的子类,确保选择 "Also create xib file for user interface"。在 DiscoverableWindowController xib 中配置您的 window,在 window.

的属性检查器中取消选中 "Visible At Launch"

然后,在您的 ViewController:

@IBAction func showSheet(sender: NSButton) {
    let discoverableWC = DiscoverableWindowController(windowNibName: "DiscoverableWindowController")
    view.window?.beginSheet(discoverableWC.window!, completionHandler: nil)
}

一般来说,您应用中的每个 window 都应由其自己的 window 控制器管理,让 window 控制器为您处理 nib 加载和实例化。

Download the sample project here.