SwiftUI MenuButton с более чем 10 элементами - PullRequest
0 голосов
/ 06 мая 2020

У меня есть SwiftUI MenuButton, который отлично работает с 10 или меньшим количеством элементов:

struct ContentView: View {
    var body: some View {
        MenuButton("My Button") {
            Button("A") { }
            Button("B") { }
            Button("C") { }
            Button("D") { }
            Button("E") { }
            Button("F") { }
            Button("G") { }
            Button("H") { }
            Button("I") { }
            Button("J") { }
        }
    }
}

Однако при добавлении 11-го элемента он не будет компилироваться, потому что SwiftUI ограничивает группы размером 10. С обычным группу (например, VStack), я бы просто обернул некоторые элементы в Group или Section, но это испортит визуальные эффекты для MenuButton.

Заключение первых 5 элементов в Group:

Wrapped in a group

Обертывание первых 5 элементов в Section:

Wrapped in a section

Заключение первых 5 элементов в VStack (интервал допустим, но можно выбрать всю группу вместе):

Wrapped in a vstack

Как правильно это сделать?

Ответы [ 2 ]

2 голосов
/ 06 мая 2020

Вот решение - вы можете сохранить массив элементов для настройки каждой кнопки пункта меню. Протестировано с Xcode 11.4.

demo

struct TestLongMenuButton: View {
    let actions = ["A","B","C","D","E","F","G","H","I","J","K","L"]

    var body: some View {
        MenuButton("My Button") {
            ForEach(actions, id: \.self) { action in
                Button(action) { }
            }
        }
    }
}
1 голос
/ 06 мая 2020

Решение Аспери - solid. Вот версия, которая позволяет выполнять отдельные действия для каждого элемента с относительной безопасностью компиляции (при условии, что каждая метка может быть отличной).

struct ContentView: View {
    enum Item: String, CaseIterable {
        case a = "Label A"
        case b = "Label B"

        func performAction() -> Void {
            switch self {
            case .a:
                print("Doing a")
            case .b:
                print("Doing b")
            }
        }
    }

    var body: some View {
        MenuButton("My Button") {
            ForEach(Item.allCases, id: \.self) { key in
                Button(key.rawValue, action: key.performAction)
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...