Как получить NSStackView как дополнительное представление для NSAlert?

Я пишу приложение со Swift на macOS. Я хочу создать NSAlert с вертикальным NSStackView, который позволит пользователю выбрать один из N вариантов. Для этого я подключаю свой NSStackView в свойстве accessoryView моего NSAlert, и по какой-то причине мои радиокнопки не отображаются.

Вот что я пробовал до сих пор:

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()

Это показывает мой 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)
let vsv = NSStackView()
vsv.orientation = NSUserInterfaceLayoutOrientation.vertical
vsv.distribution = NSStackViewDistribution.equalSpacing
vsv.alignment = .leading
vsv.isHidden = false
vsv.addView(rb, in: .center)

a.accessoryView = vsv

a.runModal()

Теперь радио-кнопка больше не появляется. Добавление дополнительных переключателей в StackView также не помогает.

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)
Другие вопросы по тегам