SwiftUI 使用枚举构建列表

问题描述 投票:0回答:3

我正在尝试基于枚举字符串创建 SwiftUI 列表。我面临这个错误:

Cannot invoke initializer for type 'List<_, _>' with an argument list of type '([HomeView.Data], @escaping (String) -> HomeMenuRow)'

enter image description here

我不明白如何使用 id 或如何迭代枚举来构建一行。

swift swiftui swift5
3个回答
16
投票

试试这个:

enum Whatever  : String, CaseIterable, Identifiable {

    var id : String { UUID().uuidString }

    case one = "one"
    case two = "two"
}

struct ContentView: View {
    var body: some View {
        VStack {
            List (Whatever.allCases) { value in
                Text(value.rawValue)
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

3
投票

您在这里不需要可识别身份。我也添加了选择,因为为什么不呢:

enum Whatever: String, CaseIterable {
    case one
    case two
}

struct ContentView: View {
  @Binding var selection: Whatever?


    var body: some View {
        VStack {
            List (Whatever.allCases, id: \.rawValue, selection: $selection) { item in
                Text(item.rawValue)
.tag(item)
            }
        }
    }
}

选择必须是可选的(这里的错误消息并没有太大帮助),但这基本上就是获取更改枚举值的列表的方式。您还可以使用它进行类型擦除,以在侧边栏中显示不同数据类型的子列表(例如书籍、杂志、视频):使用带有关联数据的枚举,按枚举情况分组,然后享受吧。 id 不一定是静态属性;如果您的情况是

one(content: Book)
您可以使用 switch 语句和
case one(let book): return book.id
计算出 id 属性,并且只需使用 id: .id 键路径。 (除非 Swift 5 中的其他地方,否则 return 关键字仍然是必需的)。


0
投票

A

ForEach
元素需要绑定,因此我尝试的另一个选择是在
.constant
中使用
ForEach
。这确实意味着您可能必须使用
item.wrappedValue
来访问属性。

ForEach(.constant(Whatever.allCases)) { item in
    Text(item.wrappedValue.rawValue
}
© www.soinside.com 2019 - 2024. All rights reserved.