You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)
            }
        }
    }
}

说明:

  1. 通过bucketList.contains(where: { $0.state == state.abrev })判断当前州是否有匹配数据,无匹配则跳过Section渲染
  2. 内部将ForEach(bucketList)改为ForEach(bucketList.filter({ $0.state == state.abrev })),直接过滤出当前州的条目,避免无效遍历,代码更简洁高效

内容的提问来源于stack exchange,提问作者You Can Do It Duffy Moon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 16:32:55