从 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 的边界对齐
Xcode 6.1 中新的基于文档的 OS X 应用程序模板