每当我尝试更新核心数据模型的值时,我都会遇到此错误。 这是我的模特
import Foundation
import CoreData
@objc(Habit)
class Habit: NSManagedObject {
@NSManaged var name: String
@NSManaged var trackingType: NSNumber
}
这是我的代码tableViewCell
override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
if selected {
self.accessoryType = UITableViewCellAccessoryType.Checkmark
if self.habit? != nil {
self.habit?.trackingType = index
}
} else {
self.accessoryType = UITableViewCellAccessoryType.None
}
// Configure the view for the selected state
}
我一直收到错误“因未捕获的异常而终止应用程序'NSInvalidArgumentException',原因:' - [习惯setTrackingType:]:无法识别的选择器发送到实例0x7fdcbb002c90'”
在线 self.habit?.trackingType = index
过去两天我一直在努力解决这个问题。
编辑:
模型习惯以下面的方式初始化
func getHabits() -> [AnyObject]{
let entityDescription =
NSEntityDescription.entityForName("Habit",
inManagedObjectContext: managedObjectContext!)
let request = NSFetchRequest()
request.entity = entityDescription
//
// let pred = NSPredicate(format: "(trackingType != -1)")
// request.predicate = pred
var error: NSError?
var objects = managedObjectContext?.executeFetchRequest(request,
error: &error)
return objects!;
}
返回的列表在应用程序的任何位置都使用。基本上我从列表中获取和项目并更新其属性,然后再次保存
答案 0 :(得分:5)
好的,所以你得到错误的原因当然是因为self.habit
引用的对象不是Habit
对象。找出对象真实情况的最简单方法是调用:
print(NSStringFromClass(habit.class))
使用核心数据和自定义NSManagedObjects
,您需要确保实体:'Habit'(在您的数据模型中)的类设置为Habit。这可确保Core Data将带有“Habit”实体描述的已获取对象强制转换为Habit类。如果你没有这样做,那么getHabits
func将返回一个NSManagedObject
的数组而不是Habit
的数组。如果是这种情况,那么代码为:{{1}将“NSManagedObject”打印到调试器。
作为旁注,您确实需要在从Core Data数据库中获取对象时检查错误。添加以下行:
println(NSStringFromClass(habit.class))
如果有任何错误,请原谅我的swift,我通常使用Objective-C。
编辑:为了纠正if objects? == nil {
print("An error occurred \error.localisedDescription")
}
错误。如果未正确实例化Failed to call designated initializer on NSManagedObject class 'X'
,则会触发此错误。您不得致电NSManagedObject
,而必须致电[[MyManagedObject alloc] init];
:
initWithEntity:insertIntoManagedObjectContext
如果您不希望将对象MyManagedObject *obj = [[MyManagedObject alloc] initWithEntity:[NSEntityDescription entityForName:@"MyManagedObject" inManagedObjectContext:context] insertIntoManagedObjectContext:context];
插入上下文,则可以通过obj
上下文参数。但是,如果您想要撤消管理以及将对象保存到数据库的能力,则需要将其与上下文相关联。
如果您想对对象进行自定义初始化,则可以覆盖nil
和awakeFromInsert
方法/函数。