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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 16:12:41