【问题标题】:Present popover from NSView从 NSView 呈现弹出框
【发布时间】:2019-02-26 02:38:38
【问题描述】:

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

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

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

【问题讨论】:

    标签: swift macos cocoa popover


    【解决方案1】:

    这是一种将现有视图控制器显示为弹出框的便捷方法。

    听起来您想创建并呈现一个新的弹出框。为此,您需要创建一个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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-08-07
      相关资源
      最近更新 更多