首页 > 解决方案 > 使用 Picker (SwiftUI) 从 CoreData 实体中选择并保存值

问题描述

我有一个 SwiftUI 应用程序,它使用 CoreData 来存储数据。我使用@FetchRequest 在视图中加载数据。

我想使用默认选择器从 CoreData 存储«Aircraft»中选择一个实体,并将用户的选择保存到另一个存储(“Flight”)。

目前我完全迷路了,不知道如何使 Picker 起作用。

  1. 我应该在 Picker 的 «selection» 字段中添加什么?
  2. 如何在 Picker 单元格的文本标签中访问模型的特定值(例如,在标签中显示带有飞机注册的字符串(我班级中的 var «registration»)?我尝试了很多选项,例如

Text("(aircraft.registration ?? "Unknown")")

,但它们都给出了错误的引用和随后的编译错误。

这是我的完整视图代码:

struct PickerView: View {

    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Aircraft.entity(), sortDescriptors: []) var aircrafts: FetchedResults<Aircraft>
    @State private var selectedAircraft = "" // should I use it here? 

    var body: some View {
        Picker("Select aircraft", selection: self.$selectedAircraft) { // here i'm lost. I want to display registration String on my Picker


            ForEach(aircrafts, id: \.self) {aircraft in
                Text("\(aircraft.registration ?? "Unknown")") // obviously I'm doing something wrong here 

                Button("Save") {
                    let newFlight = Flight(context: self.moc)
                    newFlight.aircraft = self.selectedAircraft // not sure if i'm using correct logic here to save the registration string to to the Flight entity

                    try? self.moc.save()
                    self.presentationMode.wrappedValue.dismiss()
                }
            }
        }
    }
} 

这是我的Flight类(基于CoreData实体模型自动生成):

extension Aircraft {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Aircraft> {
        return NSFetchRequest<Aircraft>(entityName: "Aircraft")
    }

    @NSManaged public var aircraftClass: String?
    @NSManaged public var aircraftModel: String?
    @NSManaged public var id: UUID?
    @NSManaged public var registration: String?

}

这是我的飞机类(基于CoreData实体模型自动生成):

extension Flight {

    @nonobjc public class func fetchRequest() -> NSFetchRequest<Flight> {
        return NSFetchRequest<Flight>(entityName: "Flight")
    }

    @NSManaged public var aircraft: String? // we are interested to store the value from picker here
    @NSManaged public var flightDuration: Double
    @NSManaged public var from: String?
    @NSManaged public var id: UUID?
    @NSManaged public var remark: String?
    @NSManaged public var timeIn: String?
    @NSManaged public var timeOut: String?
    @NSManaged public var to: String?
    @NSManaged public var totalTime: Double


}

标签: swiftxcodecore-dataswiftuipicker

解决方案


推荐阅读