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 - 发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章

发送到实例的 CoreData 无法识别的选择器

Swift:发送到实例的无法识别的选择器

Swift 3 NSCoder 无法识别的选择器发送到实例

Swift:手势识别器无法识别的选择器发送到实例

Swift无法识别的选择器发送到实例

无法识别的选择器发送到实例 - Swift