从 NSView 显示弹出窗口

Present popover from NSView

我定制了 CustomView.xib。它归 CustomView.swift 所有,其中子class 是 NSView。现在,只需添加 NSView 并将其 class 设置为 CustomView,我就可以轻松地在 Storyboard 中重用 CustomView。问题是我在 CustomView.xib 中有一个按钮,我想在单击它时显示一个弹出窗口 MyPopoverViewController 。我用谷歌搜索,发现为了显示弹出窗口,我需要使用如下方法:

presentViewController(viewController: NSViewController, asPopoverRelativeTo: NSRect, of: NSView, preferredEdge: NSRectEdge, behavior: NSPopover.Behavior)

问题是这个方法只能在 NSViewController 中使用。但我没有。我想从 NSView 中触发弹出窗口。我现在应该怎么办?这应该是可能的,因为 NSAlert 无处不在,它甚至不接受任何 NSViewController 作为参数。所以应该有一种方法可以在没有任何 NSViewController 的情况下呈现弹出窗口。

这是将现有视图控制器呈现为弹出窗口的便捷方法。

听起来您想创建并显示一个新的弹出窗口。为此,您需要创建一个 NSPopover 对象。这实际上是弹出窗口的控制器。

你的 NSPopover 有一个 contentViewController: NSViewController 属性,它有一个 view: NSView 属性。这些是将在弹出窗口中显示的视图控制器和视图。

如何创建这些由您决定。您可以通过编程方式构建它们,但如果这是嵌入在其他 nib/storyboard 文件中的可重用视图,我建议在其自己的 nib 文件中定义弹出视图和视图控制器,使 NSPopover 对象成为 nib 的所有者。然后您将像这样显示弹出窗口(在 Safari 中编写):

let popover = NSPopover()
if Bundle.loadNibNamed(nibName: "MyViewPopover", owner: popover, topLevelObjects:nil) {
    ...
    popover.show(relativeTo: view.bounds, of: view, preferredEdge: NSRectEdgeMinX)