使用 swift 的核心数据错误:[SimpleRunner.Run setTime:]: unrecognized selector sent to instance

Posted

技术标签:

【中文标题】使用 swift 的核心数据错误:[SimpleRunner.Run setTime:]: unrecognized selector sent to instance【英文标题】:Core Data Error using swift: [SimpleRunner.Run setTime:]: unrecognized selector sent to instance 【发布时间】:2016-07-17 23:42:00 【问题描述】:

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

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[SimpleRunner.Run setTime:]: unrecognized selector sent to instance.

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

运行对象

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 = 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
    

【问题讨论】:

您的 Run 实体没有名为 time 的属性。 我更改了它,从我的手机中删除了该应用程序,然后再次运行它。我仍然遇到同样的错误 尝试干净构建并清理您的模拟器。 我遇到了同样的问题 我无法在 Xcode 8 beta 2 中重现相同的问题。(您可能正在使用 beta 1?尝试更新您的 Xcode。)完全相同的实体设置,几乎相同的代码(修复了 beta 的某些部分2)。您的应用程序的其他一些部分(其他代码、构建设置和构建过程或 Xcode 版本)可能会受到影响,但我看不出有什么影响。 【参考方案1】:

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

为什么这是一件坏事,你将如何实施它?

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

你最好用类似的东西:

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

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

如果你正在为 ios10 开发,你可以跳过所有这些顺便说一句,直接使用:

let run = Run(context: managedObjectContext)

【讨论】:

为什么这是一件坏事,您将如何实施?【参考方案2】:

问题是我的 xcode 版本。我使用的是 Xcode 8 版本 1 测试版,一旦我切换到版本 2 就可以了。自我注意:学习时使用稳定版本

【讨论】:

以上是关于使用 swift 的核心数据错误:[SimpleRunner.Run setTime:]: unrecognized selector sent to instance的主要内容,如果未能解决你的问题,请参考以下文章

使用 swift 的核心数据错误:[SimpleRunner.Run setTime:]: unrecognized selector sent to instance

我从核心数据填充 PickerView 并得到错误 Index Out Of Range Swift 5

错误:Swift 2.3 不支持核心数据代码生成

在核心数据swift ios中使用未解析的标识符“模型”

iOS:Swift:核心数据:错误:+entityForName:nil 不是搜索实体名称的合法 NSManagedObjectContext 参数

Swift 核心数据问题