SwiftUI中动态隐藏列表空分区的技术实现问询
问题:隐藏SwiftUI List中无匹配数据的州分区
我有一个用USStates枚举填充的动态SwiftUI List,通过遍历bucketList字典匹配州信息展示内容,功能正常。现在需要隐藏没有匹配数据的州对应的整个Section。
核心代码
@State private var bucketList: [BucketListItems] = [] ... 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) } } }
补充代码
struct BucketListItems: Encodable, Decodable, Identifiable, Hashable { let id = UUID() var recordID: Int var url: String var user: Int var name: String var category: String var state: String var latitude: String var longitude: String var description: String var completedate: String }
解决方案
要隐藏无匹配数据的Section,只需在渲染Section前判断当前州是否存在对应的bucketList条目即可,同时可以优化内部遍历逻辑提升效率:
修改后的List代码:
@State private var bucketList: [BucketListItems] = [] ... List { ForEach(USStates.allCases) { state in // 仅当当前州有匹配条目时,才渲染Section if bucketList.contains(where: { $0.state == state.abrev }) { Section { // 直接过滤出当前州的条目,替代原遍历+判断的写法 ForEach(bucketList.filter({ $0.state == state.abrev })) { item in 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(state.rawValue) } } } }
说明:
- 通过
bucketList.contains(where: { $0.state == state.abrev })判断当前州是否有匹配数据,无匹配则跳过Section渲染 - 内部将
ForEach(bucketList)改为ForEach(bucketList.filter({ $0.state == state.abrev })),直接过滤出当前州的条目,避免无效遍历,代码更简洁高效
内容的提问来源于stack exchange,提问作者You Can Do It Duffy Moon
相关产品推荐
相关产品推荐

