SwiftUI中如何结合数据模型使用Picker并保存选中的年份值
修复步骤
- 给模型补充协议,保证遍历稳定性
给SysNoAntpatologicosModel补充遵守Identifiable、Hashable协议,避免ForEach遍历过程中状态识别错乱:
struct SysNoAntpatologicosModel: Identifiable, Hashable { // 直接复用idantnopat作为唯一ID,也可以单独声明id属性 var id: Int { idantnopat } var anio: Int var descripcion: String var idantnopat: Int var nombre: String var presente: Bool }
- 修正Picker选项匹配逻辑
当前选项的隐式tag可能和绑定的anio类型匹配出错,显式指定tag并把年份转为String渲染:
ForEach($dataSys, id: \.idantnopat) { $i in HStack{ Picker("", selection: $i.anio) { ForEach(2000...2021, id: \.self) { year in Text(String(year)) .tag(year) } } .pickerStyle(InlinePickerStyle()) .id(i.idantnopat) // 给Picker加唯一标识,避免行复用导致的状态错乱 .onChange(of: i.anio) { tag in print("year: \(tag)") } } }
- 检查数据源赋值逻辑
确认仅在页面首次加载时给dataSys赋值,不要在onAppear等每次视图刷新都会触发的方法里反复覆盖dataSys的值,否则修改后的anio会被原始数据覆盖,导致选中后跳回原值:
.onAppear { // 加空判断,仅首次加载时赋值 if dataSys.isEmpty { // 这里放dataSys初始化/接口请求赋值逻辑 // 注意如果是从其他数据源转模型,要确保anio被正确转为Int类型,不要是NSNumber类,否则类型不匹配会导致绑定失效 } }
内容的提问来源于stack exchange,提问作者Laura Ramírez
相关产品推荐
相关产品推荐

