先说解决方案: 在要显示的NSViewController子类里面,重写 loadView()
override func loadView() {
self.view = NSView()
}
MacOS与UIKit那一套有所区别,自定义的 NSViewController子类需要自己去 self.view = NSView()一下,感觉像是缺少维护的样子。
我遇到了两个因没有重写它而导致的问题: 问题特征1:
[General] -[NSNib _initWithNibNamed:bundle:options:] could not load the nibName: ProjectName.className in bundle NSBundle
问题2,NSPopover弹窗异常,只展示个光秃秃的Window,错误特征如下:
Failed to set (contentViewController) user defined inspected property on (NSWindow): -[NSPopover showRelativeToRect:ofView:preferredEdge:]: view has no window. You must supply a view in a window.
顺便分享一波弹窗代码
\
**import** Cocoa
\
**extension** NSView {
**func** showPopoverController(_ content: NSViewController) {
**let** popover = NSPopover.initWith(content)
popover.show(**self**, preferredEdge: .maxY)
}
}
\
**@objc** **public** **extension** NSPopover {
\
**static** **func** initWith(_ controller: NSViewController) -> NSPopover {
**let** popover: NSPopover = NSPopover()
popover.contentViewController = controller
popover.behavior = .transient
popover.animates = **true**
popover.contentSize = CGSize(width: 285, height: 600)
**return** popover
}
**func** show(_ view: NSView, preferredEdge: NSRectEdge) {
**if** isShown == **true** {
close()
}
show(relativeTo: view.bounds, of: view, preferredEdge: preferredEdge)
}
}```