swift coredata - 发送到实例的无法识别的选择器
Posted
技术标签:
【中文标题】swift coredata - 发送到实例的无法识别的选择器【英文标题】:swift coredata - unrecognized selector sent to instance 【发布时间】:2016-04-11 15:00:51 【问题描述】:在为coredata设置一个NSManagedObject的属性(NSSet)时,会在运行时显示这个错误:
-[__NSArray0 isEqualToSet:]: unrecognized selector sent to instance 0x1551ad60
首先,我不知道哪个实例被标识为 0x1551ad60。
其次,我知道该实例不理解“isEqualToSet”,但是我没有在我的代码中的任何地方调用它,这一定意味着它是由框架在某处调用的?我猜我的代码不正确,但我不明白如何或在哪里。
我正在运行带有 Swift 的 Xcode 7.3(我认为是 2.0?),并且我已经在 iPad 上多次删除/重新安装了该应用程序。
这是我的代码,问题行已标记。请帮忙,这快把我逼疯了!
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext:NSManagedObjectContext = appDelegate.managedObjectContext
let carEntity = NSEntityDescription.entityForName("Car", inManagedObjectContext:managedContext)
let carObj = NSManagedObject(entity: carEntity!, insertIntoManagedObjectContext: managedContext)
carObj.setValue("Toyota", forKey: "name")
carObj.setValue("Blue", forKey: "colour")
let wheelEntity = NSEntityDescription.entityForName("Wheel", inManagedObjectContext:managedContext)
let wheelObj = NSManagedObject(entity: wheelEntity!, insertIntoManagedObjectContext: managedContext)
wheelObj.setValue(Float(1.3), forKey: "tread")
(Original code)
var wheelObjArray = [NSManagedObject]()
wheelObjArray.append(wheelObj)
let wheelSet = NSSet(array: wheelObjArray)
carObj.setValue(wheelSet, forKey: "wheels")
^^ error here: unrecognized selector sent to instance
(/Original code)
(Edited code)
var wheelObjArray = carObj.mutableSetValueForKey("wheels")
wheelObjArray.addObject(wheelObj)
^^ error here: *** -[NSSet intersectsSet:]: set argument is not an NSSet
(/Edited code)
do
try managedContext.save()
print("Success!")
catch let error as NSError
print("Failed to save: \(error), \(error.userInfo)")
我的CoreData模型如下:
编辑:汽车关系“车轮”现在是一对多关系。
编辑 #2:代码已更新。
编辑 #3:解决此问题的一种可能方法是从 Wheel“car”中删除反向关系。
【问题讨论】:
你的关系好像是两边设置成一对一的,你可以把wheels
改成to many
谢谢你的建议,我以后会遇到这个问题的。
【参考方案1】:
var wheel_obj_array = [NSManagedObject]()
应该是
var wheel_obj_array = car_obj.mutableSetValueForKey("wheels")
wheel_obj_array.addObject(wheel_obj)
也不应该真正在 vars 中使用 _,因为它很难阅读任何内容。
【讨论】:
感谢您的两个建议,我已对其进行了更新,但是它产生了以下错误:*** -[NSSet intersectsSet:]: set argument is not an NSSet - on this line: wheelObjArray.addObject (wheelObj) 关系是双向的吗? 我已将 Car "wheels" 更新为一对多并卸载/重新安装了该应用程序,但仍显示新错误。 你是否删除了 let wheel_set : NSSet = NSSet(array: wheel_obj_array) car_obj.setValue(wheel_set, forKey: "wheels") 您能否将当前代码添加到上面的另一个代码块中作为编辑:D【参考方案2】:car_obj.setValue(NSSet(object: wheel_obj), forKey: "wheels")
应该可以工作。
而wheel_obj.setValue(car_obj, forKey: "relationship")
会自动设置反向关系,可能更容易写和读。
顺便说一句,您可能希望将Wheel
中的关系更改为car
,而不是当前令人困惑的 relationship
。
【讨论】:
car_obj.setValue(NSSet(object: wheel_obj), forKey("wheels")) 没用,所以我尝试了 car_obj.setValue(NSSet(object: wheel_obj), forKey: "wheels")并且错误没有改变:( 使用我提到的第二个选项更好/更容易。该错误似乎是“to many”未正确设置。您可以通过在菜单 > 编辑器中选择 .xcdatamodeId 文件时自动生成“NSManagedObject”子类来验证这一点【参考方案3】:在我的情况下,它通过删除 NSSet 来工作。发生错误时,我使用的代码是:
project.setValue(NSSet(object: agent), forKey: "agent")
然后为了使它起作用,我将其更改为:
project.setValue(object: agent, forKey: "agent")
谢谢
【讨论】:
以上是关于swift coredata - 发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章