Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 以编程方式使用popover的NSButton_Swift_Cocoa_Nsbutton - Fatal编程技术网

Swift 以编程方式使用popover的NSButton

Swift 以编程方式使用popover的NSButton,swift,cocoa,nsbutton,Swift,Cocoa,Nsbutton,我有一个关于使用弹出按钮创建动态按钮的问题。首先,让我向您展示PoC的故事板版本,以演示我想做什么: 如果我按下按钮,新的ViewController将显示在按下的按钮上: 好的,到目前为止。这就是任务。但现在我必须以编程方式添加按钮,并将它们添加到stackView中 原型代码: class ViewController: NSViewController { @IBOutlet weak var stackView: NSStackView! override fun

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

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

好的,到目前为止。这就是任务。但现在我必须以编程方式添加按钮,并将它们添加到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)
    }

}
看起来不错:

我的问题是:你会如何在每个按钮上做弹出式按钮。我应该以编程的方式添加它,还是应该使用某种脚本并重用视图?您将如何解决这个问题,即它是好的、平滑的和可重构的

如果你有一分钟,你能考虑一下赞成和反对,简短的介绍如何实施吗?p> 我添加的按钮将是我必须点击的标签,以获取更多信息和操作

+++++更新++++

我已经在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功能

啊,好的, 我可以使用: presentViewController(vc,asPopoverRelativeTo:(发送方?.bounds)!,of:sender!,preferredEdge:NSRectEdge.maxX,行为:nspover.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)
    }
}

}
谢谢


什么威勒克

你试了什么?所有按钮是否显示相同的弹出框?我会设置按钮的动作,否则它们不工作。在这个动作中,我将从故事板加载一个VC,并将其显示为popover。按钮显示文本,我需要VC中的上下文菜单。所有的弹出窗口都将显示相同的UI,并且应该对所选的标签进行操作(例如,移动、复制、删除)。我更新了上面的问题。我有一个由按钮触发的点击功能。但是如何将视图控制器表示为popover segue?