在NSSet上调用allObjects时出现“无法识别的选择器发送到实例”错误

时间:2019-04-17 12:04:46

标签: ios swift core-data

我正在尝试使用核心数据将实体加载到我的视图控制器中,但是在尝试这样做时,出现“无法识别的选择器发送到实例”错误。当Routine是Exercise的所有者时,我有两个实体Routine和Exercise。

在我的视图控制器中,我试图返回与选定例程相关的练习列表。

let exercises = routine.exercises.allObjects as! [Exercise]

但是此行引发了我错误。我对使用CoreData很陌生,所以对于这个错误的来源有点困惑。我的两个课是:

@objc(Exercise)
public class Exercise: NSManagedObject {

}
extension Exercise {

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

    @NSManaged public var name: String?
    @NSManaged public var reps: Int16
    @NSManaged public var sets: Int16
    @NSManaged public var owner: Routine

}
@objc(Routine)
public class Routine: NSManagedObject {

}
extension Routine {

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

    @NSManaged public var name: String?
    @NSManaged public var exercises: NSSet

}

我尝试遍历堆栈溢出的不同问题,但是找不到任何能够解决该错误的东西,谢谢。

编辑 print(routine.exercises)输出

<Exercise: 0x600001591e00> (entity: Exercise; id: 0xe28fa998e4a16a04 <x-coredata://024220B5-49D9-4D66-B7CB-ADE11BEB9F85/Exercise/p12> ; data: { name = "Incline Bench Press"; owner = "0xe28fa998e4b16a06 <x-coredata://024220B5-49D9-4D66-B7CB-ADE11BEB9F85/Routine/p8>"; reps = 0; sets = 4; })

错误消息为:

2019-04-17 13:23:09.069636+0100 MyFitnessApp[6564:25418954] -[Exercise allObjects]: unrecognized selector sent to instance 0x600001591e00
2019-04-17 13:23:09.075932+0100 MyFitnessApp[6564:25418954] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Exercise allObjects]: unrecognized selector sent to instance 0x600001591e00'

2 个答案:

答案 0 :(得分:1)

错误消息基本上说exercises包含一个Exercise实例,而不是NSSet实例。

仅更新属性的类型是不够的,真正重要的部分是更新数据模型,它应该是代码中定义的镜像。

在这种情况下,您应将模型中的exercises从一对一关系更改为一对多关系。需要迁移(或清除数据模型)。​​

由于属性分配是在Objective-C中动态完成的,没有适当的类型控制,所以可能发生的情况是,以类型NSSet声明的属性实际上包含一个Exercise的实例。

答案 1 :(得分:1)

现在,我已经将我的头撞了几个小时,@ Sulthan的回答解决了我所有的问题。

在“检查器”菜单中,选择您要查询NSSet的关系,然后将关系类型从“一对一”->“一对多”切换。

“对很多人”表示感谢!