SwiftUI 为LazyVGrid添加绑定按钮时无法修改遍历元素值问题
问题根因
你当前ForEach(interest)遍历拿到的i是结构体值类型的临时副本,直接修改这个副本不会同步到原数组的真实存储,自然无法触发视图更新,双向绑定也不会生效。
修复方案
核心是拿到数组元素的绑定引用,而非直接拿值拷贝,只需要调整遍历逻辑,不需要额外写自定义Binding:
LazyVGrid(columns: columns) { // 直接从父级状态路径取可选数组的绑定,不要解包成临时常量 if let interestsBinding = $profilData.detailProfil.interests { ForEach(interestsBinding) { $i in VStack{ Image(systemName: i.icon) .font(.system(size: 25, weight: .bold)) .foregroundColor(Color("TopBackGroundColor")) .padding() .background(.black) .clipShape(Circle()) .overlay(alignment: .bottomTrailing) { Button(action: { // 直接修改绑定属性,自动同步原数据+刷新UI i.enable.toggle() }, label : { Image(systemName: i.enable ? "checkmark.circle.fill" : "x.circle.fill") .font(.system(size: 25, weight: .bold)) .foregroundColor(i.enable ? Color.green : Color.red) }) .padding(.trailing, -5) .padding(.bottom, -5) } Text(i.name) .font(.title2) } } } else { HStack(alignment: .center){ Spacer() Text(LocalizedStringKey("nointerst.id")) .fontWeight(.bold) .foregroundColor(Color("TextColor")) Spacer() } .padding() .background(.gray.opacity(0.2)) .cornerRadius(20) } }
注意事项
- 确保
Interest模型遵守Identifiable协议,你当前代码能正常编译说明这步已经满足 - 不要把可选数组提前解包为局部let常量再遍历,那样只能拿到值拷贝,修改不会同步到原状态
- 遍历参数写
$i是SwiftUI遍历绑定集合的内置语法糖,会自动生成每个元素的双向绑定,不需要手动构造Binding实例
内容的提问来源于stack exchange,提问作者Ruzev
相关产品推荐
相关产品推荐

