簡體   English   中英

NSButton以編程方式彈出

[英]NSButton with popover programmatically

我有一個關於使用彈出窗口動態創建按鈕的問題。 首先,讓我向您展示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)
    }

}

看起來不錯:

在此處輸入圖片說明

我的問題是:您將如何在每個按鈕上進行彈出。 我是否也應該以編程方式添加它,還是應該使用某種Storyboard並重用視圖? 您將如何解決美觀,流暢和可重構的問題?

如果您有時間,請簡短介紹一下實現方法的利弊,請考慮一下。

我添加的按鈕將是我必須單擊的標簽,以獲取更多信息和操作。

+++++ 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函數。

嗯,好的,我可以使用: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)
    }
}

}

謝謝

什么威樂!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM