从 NSViewController 在 OS X 上加载 nib

Posted

技术标签:

【中文标题】从 NSViewController 在 OS X 上加载 nib【英文标题】:Loading nib on OS X from NSViewController 【发布时间】:2015-09-11 06:28:40 【问题描述】:

我正在尝试在 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

我正在使用窗口显示来自我的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?

【问题讨论】:

【参考方案1】:

你为什么不做一个窗口控制器来处理DiscoverableWindow

创建NSWindowController 的子类,确保选中“同时为用户界面创建 xib 文件”。在DiscoverableWindowController xib 中配置您的窗口,在窗口的属性检查器上取消选中“Visible At Launch”。

那么,在你的ViewController

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

一般来说,你应用中的每个窗口都应该由它自己的窗口控制器来管理,让窗口控制器为你处理 nib 的加载和实例化。

Download the sample project here.

【讨论】:

如果您想将 DiscoverableWindow 显示为工作表,则此方法有效。但是,DiscoverableWindowController 不接收像鼠标点击这样的 UI 事件。我有这个项目github.com/Nordin-010/OSXModalView,它对模态视图上的按钮单击没有反应。也许你知道如何解决这个问题?

以上是关于从 NSViewController 在 OS X 上加载 nib的主要内容,如果未能解决你的问题,请参考以下文章

如何从 OS X 上的框架实例化 NSViewController(即获取正确的包)

在 Cocoa App Swift [Mac OS] 中显示在 containerView 内的 NSViewController 不会与 Container 的边界对齐

Mac OS X 视图交换

Xcode 6.1 中新的基于文档的 OS X 应用程序模板

从 NSTableView 获取数据到 NSViewController

如何从 NSViewController 显示视图?