我正在尝试使用核心数据将实体加载到我的视图控制器中,但是在尝试这样做时,出现“无法识别的选择器发送到实例”错误。当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'
答案 0 :(得分:1)
错误消息基本上说exercises
包含一个Exercise
实例,而不是NSSet
实例。
仅更新属性的类型是不够的,真正重要的部分是更新数据模型,它应该是代码中定义的镜像。
在这种情况下,您应将模型中的exercises
从一对一关系更改为一对多关系。需要迁移(或清除数据模型)。
由于属性分配是在Objective-C中动态完成的,没有适当的类型控制,所以可能发生的情况是,以类型NSSet
声明的属性实际上包含一个Exercise
的实例。
答案 1 :(得分:1)
现在,我已经将我的头撞了几个小时,@ Sulthan的回答解决了我所有的问题。
在“检查器”菜单中,选择您要查询NSSet的关系,然后将关系类型从“一对一”->“一对多”切换。
“对很多人”表示感谢!