我有一个关于使用popovers创建动态按钮的问题。首先让我向您展示一个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)
}
}
看起来不错:
我的问题是:你如何对每个按钮进行弹出。我应该以编程方式添加它,还是应该使用某种故事板并重用视图?你如何解决它很好,平滑和可重构的问题?
如果您有一分钟,请您简单介绍一下如何实施它?
我添加的按钮将是我必须点击的标签,以获取更多信息和操作。
+++++ ++++ 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函数。
答案 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!。