如何将NSStackView作为NSAlert的附件视图?

时间:2017-09-01 23:42:32

标签: swift radio-button accessoryview nsalert nsstackview

我正在macOS上用Swift编写应用程序。 我想创建一个带有垂直NSStackView的NSAlert,让用户从N个选项中选择一个。为此,我将我的NSStackView连接到我的NSAlert的accessoryView属性中,由于某种原因我的单选按钮不显示。

这是我迄今为止所做的尝试:

package.Status

这向我展示了我的NSAlert,其中有一个标有Foo的单选按钮。所以附件视图似乎有效。

现在我将单选按钮放在StackView中:

let a = NSAlert()
a.messageText = "Dummy1"
a.informativeText = "Dummy2"
a.addButton(withTitle: "OK")

let rb = NSButton(radioButtonWithTitle: "Foo", target: nil, action: nil)
a.accessoryView = rb

a.runModal()

现在单选按钮不再出现了。在StackView中添加更多单选按钮也无济于事。

1 个答案:

答案 0 :(得分:0)

我能够做到这一点,但是由于我只需要固定大小,所以我没有设置任何约束。这是一个以固定宽度堆叠两个文本字段的示例:

func makeAccessoryView(usernameField: NSTextField, passwordField: NSTextField) -> NSView {
    let stackView = NSStackView(views: [usernameField, passwordField])
    let width = 300
    let height = usernameField.frame.height + stackView.spacing + passwordField.frame.height
    stackView.setFrameSize(NSSize(width: width, height: height))
    stackView.translatesAutoresizingMaskIntoConstraints = true
    stackView.orientation = .vertical
    return stackView
}

// somewhere else...
let usernameField = NSTextField(...)
let passwordField = NSTextField(...)
alert.accessoryView = makeAccessoryView(usernameField: usernameField, passwordField: passwordField)