首页 > 解决方案 > 保存到 CoreData 一次后,我收到错误“无法识别的选择器发送到实例”

问题描述

问题是我第一次后无法再次保存到 Core Data。根据类似的问题,它可能与 FetchRequest (ContentView) 中的 SortDescriptor 有关,但我无法弄清楚要进行哪些更改。帮助将不胜感激。谢谢

编辑:不幸的是,另一个问题不起作用,它是从 7 年前开始的,甚至在 swift 存在之前,我无法申请/没有帮助。

编辑:我已经删除了二进制数据的排序,但错误仍然存​​在

核心数据 xcdatamodeld 文件:

img:二进制数据日期:字符串

我收到错误:

-[_PFExternalReferenceData compare:]:无法识别的选择器发送到实例 0x600003c35810 与 userInfo (null)

这是 CameraView 组件,其中 ViewContext.save() 发生,触发错误:

struct CameraView: View {

@Environment(\.managedObjectContext) private var viewContext

@State private var showSheet: Bool = false
@State private var showImagePicker: Bool = false
@State private var sourceType: UIImagePickerController.SourceType = .camera

@State private var image: UIImage?

var body: some View {
    ZStack {
        
        VStack{
            Button(action: saveImage, label: {
                Text("Save Image")
            }).foregroundColor(.black)
            Image(uiImage: image ?? UIImage(named: "placeholder")!)
                .resizable()
                .frame(width:300, height: 300)
            
            Button("Choose Picture") {
                self.showSheet = true
                
            }.foregroundColor(.black)
            .padding()
            .actionSheet(isPresented: $showSheet) {
                ActionSheet(title: Text("Select Photo"),
                    message: Text("Choose"),
                    buttons:[
                        .default(Text("Photo Library")) {
                            self.showImagePicker = true
                            self.sourceType = .photoLibrary
                        },
                        .default(Text("Camera")) {
                            self.showImagePicker = true
                            self.sourceType = .camera
                        },
                        .cancel()
                    ]
                )
            }
            
        }.sheet(isPresented: $showImagePicker, onDismiss: loadImage){
            ImagePicker(image: self.$image, isShown: self.$showImagePicker, sourceType: self.sourceType)
        }
        
    }
    .navigationTitle("Take a Picture")
    .navigationBarTitleDisplayMode(.inline)
    .padding(0)
    
}


func saveImage () {
    print("saving to jpegData")
    
    let pickedImage = image?.jpegData(compressionQuality: 1.0)
    let drawing  = Drawing(context: viewContext)
    
    
    let date = Date()
    let format = DateFormatter()
    format.dateFormat = "yyyy-MM-dd HH:mm:ss"
    let formattedDate = format.string(from: date)
    
    drawing.img = pickedImage
    drawing.date = "Sun 2 May"
    print(pickedImage!)
    
    do {
    try viewContext.save()
    print("Image is saved")
    } catch {
    print(error.localizedDescription)

    }
    
    
}

}

这是我的应用程序视图,我将 managedObjectContext 环境传递给 ContentView:

struct Draw_DailyApp: App {

let persistenceController = PersistenceController.shared
@Environment(\.scenePhase) var scenePhase



@State var showOrderSheet = false


// Creating a global environment and placing it into the environment
@ObservedObject var searchObjectController: SearchObjectController = SearchObjectController()


var body: some Scene {
    WindowGroup {
        ContentView()
            .environment(\.managedObjectContext, persistenceController.container.viewContext)
            .environmentObject(self.searchObjectController)
    }
    .onChange(of: scenePhase) { _ in
        persistenceController.save()
    }
}

}

调用 FetchRequest 的内容视图。它由选项卡视图组成,然后相机是主视图内的导航链接(但我不认为这是这里的问题)

struct ContentView: View {

init() {
    UITabBar.appearance().backgroundColor = UIColor.purple

  }

@FetchRequest(entity: Drawing.entity(),
              sortDescriptors: [
                NSSortDescriptor(keyPath: \Drawing.img, ascending: true), NSSortDescriptor(keyPath: \Drawing.date, ascending: true)
              ]
)
var orders: FetchedResults<Drawing>

var body: some View {
        List {
            ForEach(orders, id: \.self, content: { drawing in
                Text(drawing.date ?? "Unknown")
            })
        }

    
    
    TabView {
        MoodboardView()
            .tabItem{
                Label("mood", systemImage: "lightbulb")
            }
        HomeView()
            .tabItem{
                Label("home", systemImage: "list.dash")
            }
        SketchbookView()
            .tabItem{
                Label("sketchbook", systemImage: "pencil")
            }
        TipsView()
            .tabItem{
                Label("tips", systemImage: "book")
            }


    }.accentColor(.white)
}
    

}

我在发布此问题之前尝试过的类似问题似乎要求调用堆栈,所以请告诉我是否应该在此处提供

标签: swiftcore-data

解决方案


@Joakin Danielson 我真诚地道歉。我删除了错误的行。核心数据 FetchRequest 现在工作正常,因为我删除了二进制数据上的行排序。非常感谢,非常感谢!


推荐阅读