Я пишу ComboBox в SwiftUI на macOS и хочу гибко управлять им программно, а не нажимать кнопку, и отображается список.
Я могу использовать Menu для создания наивного меню, ссылающегося на Apple Developer - Menu, но не могу найти никакого подхода к его программному управлению, например, показать или скрыть его список.
Затем я попытался настроить его с помощью List, как показано ниже. Но когда этот список отображается, он имеет место и отталкивает другие представления вниз, что не ведет себя как система по умолчанию Menu, которая плавает перед следующими представлениями.
VStack {
TextField("Ttitle", text: $string) { isEditing in
onEditing = isEditing
}
if onEditing { List(listItems, id:\.self) { Text($0) } }
}
Лучше бы такого метода не было, а его нет.
SomeViewHere()
.menu(isPresented: $showMenu) {
Button("A") {}
Button("B") {}
Button("C") {}
}
Также я нашел пост здесь, но он работает только на iOS.
Я не знаком с AppKit, поэтому не знаю, существует ли там решение. Но я также рад, если AppKit работает и готов его изучить. В любом случае, я всегда предпочитаю использовать родной SwiftUI. Итак, есть идеи, как этого добиться?
@vadian Я пробовал эти коды. Но я не думаю, что это хорошее решение для меня. Во-первых, он ведет себя не так, как я ожидал, он показывает список только при явном нажатии кнопки раскрывающегося списка. Я хочу, чтобы он показывал список, когда я редактирую (значок «I» мигает). Во-вторых, это не то «общее», чтобы его можно было повторно использовать в других пользовательских представлениях с другим поведением. Например, чтобы показать этот список меню при наведении на вид.
Вы не можете управлять меню SwiftUI, вы должны создать свое собственное
@loremipsum Я так думаю. Но он не работает правильно, просто используя VStack, как я упоминал в посте. Есть идеи, как добавить этот плавающий список?





Ссылаясь на этот пост и этот пост, я понял, как воплотить плавающий список в жизнь. Пример пользовательского показан ниже.
@State var showList: Bool = false
var body: some View {
Button("Click Me") { showList.toggle() }
.frame(width: 100, height: 20)
.overlay {
if showList {
List {
Button("AA") {}
Button("AA") {}
Button("AA") {}
}
.frame(width: 200, height: 300)
.offset(y: 160)
}
}
.zIndex(1)
Text("Hello World")
Circle().fill(.brown).frame(width: 50, height: 50)
}