【发布时间】:2022-11-15 18:11:11
【问题描述】:
我需要我的应用程序来显示数据表。数据看起来像["body": Optional("Go Shopping"), "isDeleted": Optional(false), "_id": Optional("63333b1600ce507b0097e3b3"), "isCompleted": Optional(false)] 表的列标题将是键body, isDeleted, isCompleted, _id。我将拥有该数据的多个实例,它们具有相同的键,但值不同。我需要在各自的标题下显示每个数据实例的值,并且每一行都属于一个数据实例。
例子:
我很挣扎,因为我能想到的唯一方法是使用字典,但是在视图中使用字典时遇到了很多问题。
*** 重要的提示: 该应用程序允许用户选择某个集合,然后该应用程序将加载该集合的所有数据。每个集合在其数据中都有不同的键,因此我无法创建特定的结构,因为我实际上并不知道数据中的键/值。从某种意义上说,模型必须是动态的,因为我不知道每个集合中将使用哪些键/值类型,并且在选择不同的集合时需要重绘表格。
我试过的
一个包含“值:[String: Any?]”的文档类,字符串是键,Any 是数据实例的值
class Document{
let value: [String:Any?]
init(value:[String:Any?]) {
self.value = value
}
}
在我的 ViewModel 中,我调用了一个数据库,该数据库使用所选集合名称返回该集合中所有文档的数组。我遍历数组并创建一个 Document obj,其 Document 的值看起来像 ["body": Optional("Go Shopping"), "isDeleted": Optional(false), "_id": Optional("63333b1600ce507b0097e3b3"), "isCompleted": Optional(false)],然后我将每个 Document 添加到 Document 的数组中
class DocumentsViewModel : ObservableObject {
@Published var docKeys: [String]?
@Published var docsList: [Document]?
func getDocs() {
... //Database call to get docs from collection
for doc in docs {
// add doc keys to array (used for table header)
self.docKeys = doc.value.keys.map{$0}
self.docsList?.append(Document(value: doc.value))
}
然后在我的视图中,我尝试首先显示来自 docKeys 的标题,然后使用该键遍历 [Document] 数组并访问值 var 并使用该键获取正确的值以显示在该文档的标题下
var body: some View {
Text(viewModel.collectionName)
HStack {
ForEach(viewModel.docKeys ?? [], id: \.description) {key in
Text(key.name)
VStack {
ForEach(viewModel.docsList ?? [], id: \.value) { doc in
Text(doc.value[property.name])
}
}
}
}
}
经过研究,我明白为什么我不能在未排序的字典上使用 ForEach。
我将接受有关如何显示此表的任何帮助/指导。另外,除了使用字典之外,是否还有其他建议?谢谢你!
【问题讨论】:
-
您是否希望
Document值属性中的数据只是 String 和 Bool,或者可能包括 Int、Double、数组、自定义类型等...?
标签: ios dictionary object swiftui foreach