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

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


person BearOverflow    schedule 01.09.2017    source источник
comment
Небольшой прогресс: если я создаю свой NSStackView() с конструктором, передающим NSRect, то я вижу содержимое, но оно обрезается NSRect. Мне нужно выяснить, как позволить NSStackView расширяться, чтобы соответствовать всем его подпредставлениям. Играл с приоритетами сжатия и объятий, но пока безуспешно.   -  person BearOverflow    schedule 02.09.2017


Ответы (1)


Мне удалось заставить это работать, но я не устанавливал никаких ограничений, так как мне просто нужен был фиксированный размер. Вот пример, который объединяет два текстовых поля с фиксированной шириной:

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)
person kainjow    schedule 29.01.2020