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

SwiftUI中如何结合数据模型使用Picker并保存选中的年份值

修复步骤

  1. 给模型补充协议,保证遍历稳定性
    给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
}
  1. 修正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)")
        }
    }
}
  1. 检查数据源赋值逻辑
    确认仅在页面首次加载时给dataSys赋值,不要在onAppear等每次视图刷新都会触发的方法里反复覆盖dataSys的值,否则修改后的anio会被原始数据覆盖,导致选中后跳回原值:
.onAppear {
    // 加空判断,仅首次加载时赋值
    if dataSys.isEmpty {
        // 这里放dataSys初始化/接口请求赋值逻辑
        // 注意如果是从其他数据源转模型,要确保anio被正确转为Int类型,不要是NSNumber类,否则类型不匹配会导致绑定失效
    }
}

内容的提问来源于stack exchange,提问作者Laura Ramírez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:10