Таблица SwiftUI iOS16 с расширяемыми дочерними элементами (аналогично DisclosureGroup)

В настоящее время я перемещаю старый код SwiftUI на iOS16. Раньше я использовал список с DisclosureGroups для создания таблицы (пример кода ниже).

В идеале я хочу использовать таблицу iOS16 для автоматического создания и изменения размера столбцов вместо того, чтобы заставлять фиксированные размеры иметь правильную компоновку столбцов.

List {
    ForEach(someObject, id: \.id) { vm in
        DisclosureGroup {
            Disclosure(viewModel: mv.items)
        } label: {
            Row(viewModel: vm)
        }
    }
}

Обеспечивает ли таблица такую ​​функциональность раскрытия/аккордеона?

РЕДАКТИРОВАТЬ
Я забыл упомянуть, что дочерние элементы, которые я хочу отобразить, не соответствуют столбцу родительской таблицы. Это будет собственный пользовательский интерфейс, для упрощения скажем, просто Text с использованием полной ширины.

Стоит ли изучать 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
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Насколько мне известно, нет реализации DisclosreGroup вместе с Table, но вы можете имитировать функциональность, вот начальная пинта:

struct TableItem: Identifiable, Equatable {
    let id = UUID()
    let name: String
    let value1: Int
    let value2: Int
    let value3: Int
    var expanded: Bool = false
    let children: [TableItem]
}


struct ContentView: View {
    
    @State private var someObjects: [TableItem] = (1...30).map {
        TableItem(name: "Parent \($0)",
                  value1: 0, value2: 0, value3: 0,
                  children: (1...5).map {
            TableItem(name: "child \($0)",
                      value1: Int.random(in: 0..<100), value2: Int.random(in: 0..<100), value3: Int.random(in: 0..<100),
                      children: [])
            
        }
        )
    }
    
    var body: some View {
        
        Table(of: TableItem.self) {
            TableColumn("Name") { row in
                Text(row.name).fontWeight(row.children.isEmpty ? .regular : .bold)
                    .onTapGesture {
                        if let index = someObjects.firstIndex(of: row) {
                            withAnimation {
                                someObjects[index].expanded.toggle()
                            }
                        }
                    }
            }

            TableColumn("Value 1") { row in
                Text(row.value1.formatted())
            }

            TableColumn("Value 2") { row in
                Text(row.value3.formatted())
            }

            TableColumn("Value 3") { row in
                Text(row.value3.formatted())
            }

        } rows: {
            ForEach(someObjects, id: \.id) { row in
                TableRow(row)
                if row.expanded {
                    ForEach(row.children) { child in
                        TableRow(child)
                    }
                }
            }
        }
    }
}

DisclosureGroup со списком работает, нет конкретной реализации, просто используется совместное использование для достижения такого поведения. При этом ваше решение очень хорошее! Единственная проблема заключается в том, что дети должны соответствовать таблице и не могут быть просто текстом, например, не так ли?

Deitsch 09.05.2023 11:33

Извините, хотел написать "нет реализации DislcosureGroup вместе с Table"... поправлю в ответе... по другому вашему пункту мне нужно время подумать.

ChrisR 09.05.2023 14:57

Не торопись. На данный момент я придерживаюсь более старого, статического способа сделать это. Заказчик доволен :)

Deitsch 09.05.2023 15:31

Всегда держите клиента довольным :) Я не нашел способа, кажется, невозможно охватить другое представление по всем столбцам таблицы (что имеет смысл, если вы думаете о сортировке). Также пытался использовать Grid, но это приводит к другим проблемам... так что, возможно, лучше остаться с пользовательским списком.

ChrisR 09.05.2023 19:38

Я также пробовал с Grid, не повезло. Я понимаю, почему это не работает, но сценарий детей очень подходит. Посмотрим, может они представят что-то на грядущей WWDC. - выяснить, что это не работает, тоже миссия выполнена, спасибо за попытку!

Deitsch 10.05.2023 09:11

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