删除 NSManagedObject 时出错 [重复]

Posted

技术标签:

【中文标题】删除 NSManagedObject 时出错 [重复]【英文标题】:Error when deleting NSManagedObject [duplicate] 【发布时间】:2015-08-17 17:40:25 【问题描述】:

我有三个控制器,一个用于显示所有数据,第二个用于查看已删除项目,第三个用于编辑。除了删除NSManagedObject之外,一切正常,目前该应用程序因错误而崩溃;

无法识别的选择器发送到实例 0x7f945b56a680 2015-08-17 18:35:08.835 AppTest [8008:435289] ***由于未捕获而终止应用程序 异常“NSInvalidArgumentException”,原因: '-[NSManagedObjectContext delete:]: 无法识别的选择器发送到 instance ... 以 NSException 类型的未捕获异常终止 (lldb)

为什么会发生此错误,我如何删除 NSManagedObject 中的 UINavigationController 和 popToRootController 以转回 collection view

这是我在editViewController 中一直在尝试做的事情;

let context = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

@IBAction func remove(sender: AnyObject) 

    context?.delete(self.selectedObject)

    var error: NSError?
    context?.save(&error)

    self.navigationController?.popToRootViewControllerAnimated(true)


更新:我使用popToRootViewController方法没有问题,但使用应该是deleteObject()的删除方法。现在我知道我看到的问题有很多问题。

【问题讨论】:

我想知道这是否可以编译。 NSManagedObjectContext 没有delete() 方法,只有deleteObject() 实际上delete 方法是UIResponderStandardEditActions 协议的一部分,该协议被定义为NSObject 上的一个类别(一个“非正式协议”)。这解释了代码编译的原因。 【参考方案1】:

您需要deleteObject(),而不是delete(),因为delete 是NSObject 上未实现的扩展。

你的代码应该是:

context?.deleteObject(self.selectedObject as NSManagedObject)

【讨论】:

"...delete 是 NSObject 的基础级函数。"不。当然,如果这是真的,那么一开始就不会抛出无法识别的选择器异常。 我把它改成了“未实现的扩展”。以后,如果您发现语言不符合您的喜好,请提出修改建议 - 您的声誉足以改善帖子的语言。

以上是关于删除 NSManagedObject 时出错 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 NSManagedObject 上调用 MR_createEntity 时出错

iOS 8 Swift:使用 segue 编辑 NSManagedObject:声明类型时出错

运行“npm runeject”时出错。错误“删除未跟踪的文件,存储或提交任何更改,然后重试。”

如何在应用程序退出时正确删除“临时”NSManagedObject

如何在核心数据 NSManagedObject 关系的 NSSet 中添加或删除项目时触发通知?

应更新数据时,NSManagedObject 的删除/插入与更新