SwiftUI中如何基于[String: [Int]]字典创建可展开列表
解决SwiftUI字典分组列表的展开功能问题
要实现可展开的分组列表,核心是用DisclosureGroup组件管理每个分组的展开状态,同时维护一个状态字典跟踪每个key的展开状态。修改后的代码如下:
struct ExpandableListView: View { // 定义字典数据 let dict: [String: [Int]] = ["key1": [1,2,3,4], "key2": [6,7,8,9]] // 跟踪每个分组的展开状态,默认全部折叠 @State private var expandedStates: [String: Bool] = [:] var body: some View { List { // 遍历排序后的字典key ForEach(dict.keys.sorted(), id: \.self) { key in // 使用DisclosureGroup实现展开折叠 DisclosureGroup(isExpanded: $expandedStates[key, default: false]) { // 分组内容:遍历对应的值数组 if let values = dict[key] { ForEach(values, id: \.self) { x in Text("\(x)") } } } label: { // 分组标题 Text(key) } } } .onAppear { // 初始化所有分组的默认折叠状态 dict.keys.forEach { key in expandedStates[key] = false } } } }
关键修改说明:
- @State变量expandedStates:用字典存储每个分组的展开状态,
default: false确保未初始化的key默认折叠。 - DisclosureGroup组件:替代原来的Section,它自带展开/折叠的UI交互,通过
isExpanded绑定状态变量控制显示。 - 安全解包:把原来的
dict[key]!改成if let values = dict[key],避免字典key不存在时的崩溃。 - 初始化状态:在
onAppear中给所有key设置初始折叠状态,确保初始界面一致。
内容的提问来源于stack exchange,提问作者Jameel
相关产品推荐
相关产品推荐

