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

SwiftUI自定义Chip按钮选中无响应:如何实现展开显示关闭按钮

问题分析与解决方案

你的代码存在三个核心问题,导致点击按钮后没有任何反应:


1. 错误在数据模型中使用@Binding

@Binding是视图间传递状态的工具,不应该放在数据结构体(RCHChip)内部。把@Binding放在模型里会导致状态管理混乱,无法正确同步视图更新。

2. 传递给子视图的是对象副本

原代码中rchChip.first(where: {$0.id == chip.id})获取的是数组元素的值类型副本,修改副本的isSelected不会影响原数组中的元素,自然无法触发视图刷新。

3. 闭包中修改的是副本而非原对象

原代码里chip.isSelected = true修改的是ForEach循环生成的临时副本,不是原数组中的真实元素,点击动作无法改变实际状态。


修正后的完整代码

第一步:重构数据模型

移除@Binding,让RCHChip成为普通的数据结构体:

struct RCHChip: Identifiable {
    let id: String
    let title: String
    var isSelected: Bool
    
    init(id: String = UUID().uuidString, title: String, isSelected: Bool = false) {
        self.id = id
        self.title = title
        self.isSelected = isSelected
    }
}

第二步:修改子视图,使用绑定传递状态

让RCHChipView直接接收绑定的RCHChip对象,确保能修改原数据:

struct RCHChipView: View {
    @Binding var chip: RCHChip
    
    var body: some View {
        HStack(spacing: 0) {
            Button {
                chip.isSelected = true
            } label: {
                Text(chip.title)
            }
            if chip.isSelected {
                Button {
                    chip.isSelected = false
                } label: {
                    Image("NavigationCloseIcon")
                        .resizable()
                        .frame(width: 16, height: 16) // 可根据需求调整图标大小
                }
            }
        }
    }
}

第三步:父视图正确传递绑定数组

使用ForEach($chips)直接遍历绑定数组,确保子视图能修改原数据:

struct ContentView: View {
    @State private var chips: [RCHChip] = [
        RCHChip(title: "Datum"),
        RCHChip(title: "Person"),
        RCHChip(title: "Third") // 新增第三个按钮
    ]
    
    var body: some View {
        HStack {
            ForEach($chips) { $chip in
                RCHChipView(chip: $chip)
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者user20273483

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:15:58