31

我正在尝试创建一个简单的动态列表,分组为多个部分。(SwiftUI iOS13 Xcode11 beta 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 行的列表。部分标题、所有内容单元格和页脚都水平组合成一行。

我错过了什么?

4

4 回答 4

61

提供List一组项目似乎会错误地将Section其视为单个视图。

您可能应该为此提交雷达,但与此同时,这将为您提供您正在寻找的行为:

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 {
            ForEach(mygroups) { gr in
                Section(header: Text(gr.title),
                        footer: Text("...footer...") ) {
                            ForEach(gr.items.identified(by: \.self)) { item in
                                Text(item)
                            }
                }
            }
        }
    }
}

于 2019-06-20T17:18:27.180 回答
15

只是上面正确答案的一个小修复。自从

ForEach(gr.items.identified(by: \.self)) { item in
                            Text(item)
                        }

不像我那样编译,所以它编译并且像一个魅力一样工作:

ForEach(gr.items, id: \.self, content: { item in
                            Text(item)
                        })
于 2019-10-21T12:38:26.833 回答
1

虽然上述解决方案适用于静态数据,但我遇到了不同的情况。就我而言,第一次组成列表时,“mygroups”等效项为空。在 .onAppear{} 块中,我构建了组。

建立组后,我会更新 @State 并且 List 会因这条老朋友消息而崩溃:

'NSInternalInconsistencyException',原因:'无效更新:无效的节数。更新后表视图中包含的节数(2)必须等于更新前表视图中包含的节数(2),加上或减去插入或删除的节数(2插入,0已删除)。

我从一个空数组变成了一个包含两个部分的数组。我认为 List 还没有为如此复杂的动态变化做好准备(除非我还没有找到 API)。

我可能会尝试在列表有机会看到它之前构建它。

于 2019-11-22T13:25:33.890 回答
-2

将列表嵌入 VStack 为我解决了这个问题。

于 2020-04-14T09:18:51.973 回答