SwiftUI层级列表选择功能无法实现,求排查问题(附代码)
解决SwiftUI层级列表无法选中的问题
你的代码存在两个核心问题导致选择功能失效,修复方案如下:
1. 必须开启列表的编辑模式
SwiftUI的列表选择功能默认处于关闭状态,需要显式开启编辑模式才能激活选择交互。可以通过绑定环境变量或添加控制按钮来切换编辑状态。
2. 保证Hashable实现的稳定性(可选但关键)
虽然你的Node实现了Hashable,但自动合成的哈希逻辑会包含childNodes,可能导致子节点变化时哈希值不稳定。建议手动基于唯一的id实现Hashable,确保选中状态不受子节点影响。
修复后的完整代码
struct Node: Identifiable, Hashable { var id: String = UUID().uuidString var name: String var childNodes: [Node]? // 手动实现Hashable,仅基于id保证稳定性 static func == (lhs: Node, rhs: Node) -> Bool { lhs.id == rhs.id } func hash(into hasher: inout Hasher) { hasher.combine(id) } } struct HierarchicalData_List: View { @State var dataSource = [ Node(name: "1", childNodes: [Node(name: "1.1")]), Node(name: "2", childNodes: [Node(name: "2.1", childNodes: [Node(name: "2.1.1")])]) ] @State var selectedNodes: Set<Node> = [] // 控制编辑模式 @State private var editMode: EditMode = .inactive var body: some View { VStack { // 添加手动切换编辑状态的按钮 Button(editMode == .active ? "完成" : "编辑") { editMode = editMode == .active ? .inactive : .active } List(dataSource, children: \.childNodes, selection: $selectedNodes) { node in Text(node.name) } .listStyle(InsetListStyle(alternatesRowBackgrounds: true)) .environment(\.editMode, $editMode) } } }
额外优化方案
如果列表嵌套在NavigationStack(iOS16+)或NavigationView中,可直接使用系统默认的编辑按钮,代码更简洁:
.toolbar { EditButton() }
开启编辑模式后,点击列表项左侧的圆圈即可选中,选中项会自动加入selectedNodes集合。
内容的提问来源于stack exchange,提问作者Vandijk
相关产品推荐
相关产品推荐

