NSButton以编程方式使用popover

时间:2017-07-13 15:24:59

标签: swift cocoa nsbutton

我有一个关于使用popovers创建动态按钮的问题。首先让我向您展示一个PoC的故事板版本,以演示我想要做的事情:

enter image description here

如果按下按钮,新的ViewController将显示在按下的按钮上:

enter image description here

好到目前为止。这是任务。但现在我必须以编程方式添加按钮并将它们添加到stackView。

原型代码:

class ViewController: NSViewController {

    @IBOutlet weak var stackView: NSStackView!

    override func viewDidLoad() {
        super.viewDidLoad()
        for i in (1...5) {
            addButton(i)
        }
    }

    func addButton(_ i: Int){
        let button = NSButton(title: "TAG Button \(i)", target: nil,     action: nil)
        stackView.addArrangedSubview(button)
    }

}

看起来不错:

enter image description here

我的问题是:你如何对每个按钮进行弹出。我应该以编程方式添加它,还是应该使用某种故事板并重用视图?你如何解决它很好,平滑和可重构的问题?

如果您有一分钟,请您简单介绍一下如何实施它?

我添加的按钮将是我必须点击的标签,以获取更多信息和操作。

+++++ ++++ UPDATE

我已经在SB中组成了弹出视图控制器。我的按钮有一个单击目标并调用一个函数。那很好,接缝非常实用。但是我怎样才能从按钮中弹出弹出窗口?

@objc func click(_ sender: NSButton?){
    let sb = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
    if let vc: NSViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? NSViewController {

         // how to set the vc as popover over the button?
    }
}

sender没有presentViewController函数。

1 个答案:

答案 0 :(得分:0)

啊,好的, 我可以用:     presentViewController(vc,asPopoverRelativeTo :( sender?.bounds)!, of:sender!,preferredEdge:NSRectEdge.maxX,behavior:NSPopover.Behavior.transient)

所以整个代码:

class ViewController: NSViewController {

@IBOutlet weak var stackView: NSStackView!

override func viewDidLoad() {
    super.viewDidLoad()
    for i in (1...5) {
        addButton(i)
    }
}

func addButton(_ i: Int){
    let button = NSButton(title: "TAG Button \(i)", target: nil, action: nil)
    button.target = self
    button.action = #selector(self.click)
    stackView.addArrangedSubview(button)

}

@objc func click(_ sender: NSButton?){
    let sb = NSStoryboard(name: NSStoryboard.Name("Main"), bundle: nil)
    if let vc: NSViewController = sb.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier("TagPopupViewController")) as? NSViewController {

        presentViewController(vc, asPopoverRelativeTo: (sender?.bounds)!, of: sender!, preferredEdge: NSRectEdge.maxX, behavior: NSPopover.Behavior.transient)
    }
}

}

谢谢

Willeke!。