В настоящее время я перемещаю старый код SwiftUI на iOS16. Раньше я использовал список с DisclosureGroups для создания таблицы (пример кода ниже).
В идеале я хочу использовать таблицу iOS16 для автоматического создания и изменения размера столбцов вместо того, чтобы заставлять фиксированные размеры иметь правильную компоновку столбцов.
List {
ForEach(someObject, id: \.id) { vm in
DisclosureGroup {
Disclosure(viewModel: mv.items)
} label: {
Row(viewModel: vm)
}
}
}
Обеспечивает ли таблица такую функциональность раскрытия/аккордеона?
РЕДАКТИРОВАТЬ
Я забыл упомянуть, что дочерние элементы, которые я хочу отобразить, не соответствуют столбцу родительской таблицы. Это будет собственный пользовательский интерфейс, для упрощения скажем, просто Text с использованием полной ширины.





Насколько мне известно, нет реализации 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)
}
}
}
}
}
}
Извините, хотел написать "нет реализации DislcosureGroup вместе с Table"... поправлю в ответе... по другому вашему пункту мне нужно время подумать.
Не торопись. На данный момент я придерживаюсь более старого, статического способа сделать это. Заказчик доволен :)
Всегда держите клиента довольным :) Я не нашел способа, кажется, невозможно охватить другое представление по всем столбцам таблицы (что имеет смысл, если вы думаете о сортировке). Также пытался использовать Grid, но это приводит к другим проблемам... так что, возможно, лучше остаться с пользовательским списком.
Я также пробовал с Grid, не повезло. Я понимаю, почему это не работает, но сценарий детей очень подходит. Посмотрим, может они представят что-то на грядущей WWDC. - выяснить, что это не работает, тоже миссия выполнена, спасибо за попытку!
DisclosureGroup со списком работает, нет конкретной реализации, просто используется совместное использование для достижения такого поведения. При этом ваше решение очень хорошее! Единственная проблема заключается в том, что дети должны соответствовать таблице и не могут быть просто текстом, например, не так ли?