gpt4 book ai didi

swift - 以编程方式带有弹出窗口的 NSButton

转载 作者:行者123 更新时间:2023-11-30 12:18:43 25 4
gpt4 key购买 nike

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

enter image description here

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

enter image description here

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

原型(prototype)代码:

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

我的问题是:如何在每个按钮上执行弹出窗口。我也应该以编程方式添加它,还是应该使用某种 Storyboard 并重用 View ?你会如何解决它的美观、流畅和可重构的问题?

如果您有时间,能否请您考虑一下其优点和缺点,并简要介绍一下如何实现?

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

+++++更新++++

我已经在 SB 中制作了弹出 View Controller 。我的按钮有一个点击目标并调用一个函数。这很好,接缝非常有用。但是我怎样才能从按钮中分离出弹出窗口呢?

@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:发送者!,preferredEdge:NSRectEdge.maxX,行为: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)
}
}

}

谢谢

什么威勒克!

关于swift - 以编程方式带有弹出窗口的 NSButton,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45085062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com