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

如何用SwiftUI Picker从@Query结果中选择医生数据?

SwiftUI Picker 结合 Core Data @Query 选择医生失败的解决办法

在健康应用录入药物信息时,通过Core Data的@Query获取医生列表,使用SwiftUI Picker选择开具药物的医生,但设置.tag(mp)后无法正常工作,可从以下几个方面排查解决:

1. 确保选中值类型匹配

  • 确认绑定的prescribedBy类型与MedicalPersonnel实体一致,且为可选类型(Picker初始状态可能无选中项)。示例代码:
    @State private var prescribedBy: MedicalPersonnel?
    
  • 若prescribedBy是药物实体的关联属性,需保证绑定的是可选值(如$medication.prescribedBy,其中medication.prescribedBy定义为MedicalPersonnel?)。

2. 为ForEach指定明确的标识符

Core Data实体默认遵循Identifiable,但遇到匹配问题时,可显式指定ID:

Picker("Prescribed By", selection: $prescribedBy) {
    ForEach(medicalPersonnel, id: \.objectID) { mp in
        Text("\(mp.surname)").tag(mp as MedicalPersonnel?)
    }
}

使用objectID作为ID是Core Data实体的可靠选择,因为每个实体的objectID唯一。

3. 处理@Query的异步加载特性

@Query是异步加载数据的,初始状态下medicalPersonnel可能为空,导致Picker无选项。可添加默认占位选项:

Picker("Prescribed By", selection: $prescribedBy) {
    Text("请选择医生").tag(nil as MedicalPersonnel?)
    ForEach(medicalPersonnel) { mp in
        Text("\(mp.surname)").tag(mp as MedicalPersonnel?)
    }
}

4. 实现实体的Equatable协议

SwiftUI Picker依赖值的相等性匹配选中项,需为MedicalPersonnel实体手动实现Equatable:

extension MedicalPersonnel: Equatable {
    public static func == (lhs: MedicalPersonnel, rhs: MedicalPersonnel) -> Bool {
        lhs.objectID == rhs.objectID
    }
}

通过objectID判断相等,能准确识别Core Data实体的唯一性。

5. 验证绑定的双向生效

若prescribedBy是关联到药物实体的属性,确保绑定的是实体的属性引用,而非独立变量。例如:

@ObservedObject var medication: Medication

// 在Picker中使用
Picker("Prescribed By", selection: $medication.prescribedBy) {
    // ...选项代码
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 11:12:39