如何用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
相关产品推荐
相关产品推荐

