Как программно управлять меню в SwiftUI на macOS?

Я пишу 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. Итак, есть идеи, как этого добиться?

NSCombobox в NSViewRepresentable не вариант?
vadian 02.04.2023 10:41

@vadian Я пробовал эти коды. Но я не думаю, что это хорошее решение для меня. Во-первых, он ведет себя не так, как я ожидал, он показывает список только при явном нажатии кнопки раскрывающегося списка. Я хочу, чтобы он показывал список, когда я редактирую (значок «I» мигает). Во-вторых, это не то «общее», чтобы его можно было повторно использовать в других пользовательских представлениях с другим поведением. Например, чтобы показать этот список меню при наведении на вид.

Yiming Designer 02.04.2023 11:34

Вы не можете управлять меню SwiftUI, вы должны создать свое собственное

lorem ipsum 02.04.2023 12:09

@loremipsum Я так думаю. Но он не работает правильно, просто используя VStack, как я упоминал в посте. Есть идеи, как добавить этот плавающий список?

Yiming Designer 03.04.2023 04:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
85
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ссылаясь на этот пост и этот пост, я понял, как воплотить плавающий список в жизнь. Пример пользовательского показан ниже.

@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)
}

Другие вопросы по теме