MacOS开发:NSPopover 弹出异常,只展示空 window

359 阅读1分钟

先说解决方案: 在要显示的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)

    }

}```