我有一个动态 SwiftUI 列表,它使用状态枚举进行填充。然后它循环遍历我的数据字典,寻找状态匹配来显示数据。所有这一切都很完美。我想做但又苦苦挣扎的是隐藏那些空的状态。
有问题的代码部分是:
List {
ForEach(USStates.allCases) { states in
Section {
ForEach (bucketList) { item in
if (item.state == states.abrev) {
NavigationLink(destination: ItemDetails(blItem: item.recordID)) {
Label(item.name, systemImage: item.monogram)
.frame(height: 50)
.foregroundColor(item.completedate=="0000-00-00" ? .white : .red)
}
}
}
} header: {
Text(states.rawValue)
}
}
}
我尝试过使用 Visibility,但无法完全获得我想要的结果。当某个状态没有匹配项时,我希望隐藏整个部分。
这不是 SwiftUI 问题,而是数据过滤问题。不要循环遍历此视图中没有业务显示的状态。 😉
您可以有一个单独的
var
,它仅提供存储桶列表中的状态 - 而不是以这种未经过滤的方式使用 .allCases
。
现在,在你的代码中(或者更好的是,在你的viewModel或presenter中),你可以这样做:
var filteredStates: [USStates] {
USStates.allCases.filter { state in
bucketList.contains(state)
# note: maybe you need to compare `abbrev` here- I see from your code they are likely different types.
}
}
然后使用它代替
USStates.allCases
在 List
中进行迭代。
List {
ForEach(filteredStates) { states in /* ... */ }
/** etc... **/
}