ios - 使用 swift : [SimpleRunner. 运行 setTime:] 时出现核心数据错误:无法识别的选择器发送到实例

标签 ios swift core-data nsmanagedobjectcontext appdelegate

我目前正在尝试将核心数据集成到我的项目中。起初我没有使用 Core Data,但后来决定使用,所以我创建了一个新项目,然后将代码从 AppDelegate 移到我正在处理的项目中。我的项目名称是 SimpleRunner,到目前为止我只有一个实体 Run。在我的 SimpleRunner.xcdatamodel 中,我创建了 Run Entity 并将其分配给我的 Run 类。这是一张照片 Run Entity这是我为它分配 Run 类 pic但是,当我尝试保存运行时,出现以下错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[SimpleRunner.Run setTime:]:发送到实例的无法识别的选择器。

我知道这是小事,请有人帮忙!

运行对象

import CoreData
class Run:NSManagedObject{
@NSManaged var time:String
@NSManaged var distance:String
@NSManaged var runImage:Data?
}

应用程序代理

// MARK: - Core Data stack

lazy var applicationDocumentsDirectory: NSURL = {
    // The directory the application uses to store the Core Data store file. This code uses a directory named "derivative.DataDemo" in the application's documents Application Support directory.
    let urls = FileManager.default().urlsForDirectory(.documentDirectory, inDomains: .userDomainMask)
    return urls[urls.count-1]
}()

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model.
    let modelURL = Bundle.main().urlForResource("SimpleRunner", withExtension: "momd")!
    return NSManagedObjectModel(contentsOf: modelURL)!
}()

lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.appendingPathComponent("SimpleRunner.sqlite")
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
        dict[NSLocalizedFailureReasonErrorKey] = failureReason

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}()

lazy var managedObjectContext: NSManagedObjectContext = {
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
    let coordinator = self.persistentStoreCoordinator
    var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    managedObjectContext.persistentStoreCoordinator = coordinator
    return managedObjectContext
}()

// MARK: - Core Data Saving support

func saveContext () {
    if managedObjectContext.hasChanges {
        do {
            try managedObjectContext.save()
        } catch {
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            let nserror = error as NSError
            NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
            abort()
        }
    }
}

保存运行方法中出现错误,其中 run.time = 时间

  func saveRun(time:String,distance:String,image:UIImage){

    run = NSEntityDescription.insertNewObject(forEntityName: "Run", into: managedObjectContext) as! Run

    run.time = time <--------- WHERE THE ERROR IS
    run.distance = distance
    run.runImage = UIImagePNGRepresentation(image)

    do {
        try managedObjectContext.save()
    } catch {
        print(error)
        return
    }
}

最佳答案

您是否在模型中声明类名?我看到您正在将 NSEntityDescription.insertNewObject... 的结果强制转换为 Run (顺便说一句,这是一件坏事),它实际上可能是一个 NSManagedObject 如果你没有正确设置类。

Why is it a bad thing and how would you implement it?

如果你的强制转换被证明是错误的,你基本上是在对编译器撒谎,并且不会给你的代码“出局”。

你最好这样做:

guard let run = NSEntityDescription.insertNewObject(forEntityName: "Run", into: managedObjectContext) as? Run else { 
  //Do something here
}

甚至:

if let run = NSEntityDescription.insertNewObject(forEntityName: "Run", into: managedObjectContext) as? Run {
  //Put your logic here
}

由于这是“开发人员错误”的情况,我将在闭包内使用防护和 fatalError。

如果您正在为 iOS10 进行开发,您可以跳过所有这些顺便说一句,只需使用:

let run = Run(context: managedObjectContext)

关于ios - 使用 swift : [SimpleRunner. 运行 setTime:] 时出现核心数据错误:无法识别的选择器发送到实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38426956/

相关文章:

ios - 我有一个 Storyboard,我插入这个。我想在启动 Controller 之前在 Storyboard上获取控件的名称。如何?

ios - 我可以从 Swift 中的 SecKeyRef 对象获取模数或指数吗?

swift - 为什么我应该使用 NSManagedObjectContext 的 Perform() 和 PerformAndWait() 而我可以使用 DispatchQueue.global

iphone,在不执行提取的情况下获取对象计数?

objective-c - 连接 UITextField 以更新标签

ios - Swift:跳过导航 Controller 堆栈中的第一个(和更多)屏幕

swift - 如何从 Firebase 数据库查询用户的详细信息?

swift - 继承托管对象

java - 使用约束布局针对不同的屏幕尺寸进行设计

swift - 在代码中更改 Storyboard "View As"设备