セクションにグループ化された単純な動的リストを作成しようとしています。 (SwiftUI iOS13 Xcode11ベータ2)
単純な静的な例は次のとおりです。
struct StaticListView : View {
var body: some View {
List {
Section(header: Text("Numbers"), footer: Text("...footer...")) {
Text("1")
Text("2")
Text("3")
}
Section(header: Text("Letters"), footer: Text("...footer...")) {
Text("a")
Text("b")
Text("c")
}
}
}
}
予想通り、セクションヘッダーとフッターを含むニースリストが表示されます。
しかし、私がこのような動的なリストからこれをやろうとすると:
struct TestData: Identifiable {
var id = UUID()
var title: String
var items: [String]
}
struct ListView : View {
let mygroups = [
TestData(title: "Numbers", items: ["1","2","3"]),
TestData(title: "Letters", items: ["A","B","C"]),
TestData(title: "Symbols", items: ["€","%","&"])
]
var body: some View {
List (mygroups) { gr in
Section(header: Text(gr.title),
footer: Text("...footer...") ) {
ForEach(gr.items.identified(by: \.self)) { item in
Text(item)
}
}
}
}
}
結果は3行のみのリストです。セクションヘッダー、すべてのコンテンツセル、およびフッターの両方が1つの行に水平に結合されます。
何が欠けていますか?
上記のソリューションは静的データに対して機能しますが、私は別の状況に直面しています。私の場合、リストが最初に作成されたとき、「mygroups」に相当するものは空です。 .onAppear {}ブロックで、グループを作成します。
グループが作成されたら、@ Stateを更新し、リストはこの古いフレンドメッセージでクラッシュします。
'NSInternalInconsistencyException'、理由: '無効な更新:無効なセクション数。更新後のテーブルビューに含まれるセクションの数(2)は、更新前のテーブルビューに含まれるセクションの数(2)に、挿入または削除されたセクションの数のプラスまたはマイナス(挿入数2、0)と等しい必要があります。削除されました)。
空の配列から2つのセクションを持つ配列に変更しました。このような複雑な動的変更に対応できるリストはまだ用意されていないと思います(まだ見つけていないAPIがない限り)。
私がしそうなことは、リストがそれを見る機会を得る前に、これを試して構築することです。
リストをVStackに埋め込むと、問題が解決しました。