Как получить 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)