【发布时间】:2020-04-02 03:12:04
【问题描述】:
我有一个SwiftUI 应用程序将数据保存在CoreData 中。我想要一个 Picker 在哪里
用户可以选择一个项目(从一个实体),然后将该信息存储在
另一个要显示为 Picker 选择的实体。
我有一个名为 Patient 的实体,用户在其中添加数据。我有一个实体 名为 Clinic 的用户创建的对象列表。目的是使用 选择器可以快速添加信息,而无需重复键入每个项目 病历。
在Swift 中,我通过将 UIPicker 附加到 TextField 来做到这一点。那工作得很好。我有
无法在 SwiftUI 中做同样的事情。我可以创造和人口
选择器数据,我成功地将更改保存到患者实体,但我有
无法将 Patient Clinic 数据作为默认值加载到选取器中
详细视图已加载。
这块app相当于master/detail样式。 DetailView 是:
struct DetailView: View {
@Environment(\.managedObjectContext) var managedObjectContext
@Environment(\.presentationMode) var presentationMode
@FetchRequest(fetchRequest: Clinic.getAllClinics()) var clinics: FetchedResults<Clinic>
@State private var selectClinicItem: Int = 0
var patient: Patient
@State private var updatedFirstName: String = "No First Name"
@State private var updatedLastName: String = "No Last Name"
@State private var updatedClinic: String = "Clinic Not Chosen"
@State private var chosenClinicUUID: UUID = UUID()
var body: some View {
ScrollView {
Group {//top group
VStack {
MyDataCell(tfData: $updatedFirstName, passedInLabel: "First Name", patient: patient, patientAttribute: patient.firstName ?? "No First")
}//Top VStack - 8 views
}//top Group
Group {//second group
Form {
Picker(selection: self.$chosenClinicUUID, label: Text("Choose Clinic")) {
ForEach(clinics) { c in
Text("\(c.name ?? "no name")")
}
}
.frame(width:320, height: 30)
}//Form
.frame(width:350, height: 200)
.clipShape(RoundedRectangle(cornerRadius: 12))
.overlay(RoundedRectangle(cornerRadius: 12)
.stroke(Color.gray, lineWidth: 2))
.padding(.leading, 12)
.padding(.top, 20)
.padding(.bottom, 20)
}//second Group
}//scroll or top level Form
.modifier(AdaptsToSoftwareKeyboard())
.navigationBarTitle("View and Edit", displayMode: .inline)
.navigationBarItems(trailing: Button(action: {
self.patient.firstName = self.updatedFirstName
self.patient.lastName = self.updatedLastName
self.patient.clinicName = self.updatedClinic
self.patient.clinicID = self.chosenClinicUUID
let n = self.clinics.filter { $0.id == self.patient.clinicID }
if n.count > 0 {
self.patient.clinicName = n[0].name
}
do {
try self.managedObjectContext.save()
} catch {
print(error)
}
self.updatedFirstName = ""
self.updatedLastName = ""
self.updatedClinic = ""
self.presentationMode.wrappedValue.dismiss()
}) {
Text("Save")
})
}//body
}
作为参考,Patient 类:
public class Patient : NSManagedObject, Identifiable {
@NSManaged public var id: UUID
@NSManaged public var firstName: String?
@NSManaged public var lastName: String?
@NSManaged public var clinicName: String?
@NSManaged public var clinicID: UUID
}
extension Patient {
static func getAllPatients() -> NSFetchRequest<Patient> {
let request: NSFetchRequest<Patient> = Patient.fetchRequest() as! NSFetchRequest<Patient>
let sortDescriptor = NSSortDescriptor(key: "lastName", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
}
诊所类:
public class Clinic : NSManagedObject, Identifiable {
@NSManaged public var id: UUID
@NSManaged public var name: String?
@NSManaged public var comment: String?
@NSManaged public var isShown: Bool
}
extension Clinic {
static func getAllClinics() -> NSFetchRequest<Clinic> {
let request: NSFetchRequest<Clinic> = Clinic.fetchRequest() as! NSFetchRequest<Clinic>
let sortDescriptor = NSSortDescriptor(key: "name", ascending: true)
request.sortDescriptors = [sortDescriptor]
return request
}
}
任何指导将不胜感激。 Xcode 版本 11.2.1 (11B500)
【问题讨论】:
标签: ios xcode core-data swiftui