使用 Coredata Swift 发送到实例的无法识别的选择器
unrecognized selector sent to instance with Coredata Swift
每当我尝试更新核心数据模型的值时,我总是收到此错误。
这是我的模型
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
}
我一直收到错误 "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Habit setTrackingType:]: unrecognized selector sent to instance 0x7fdcbb002c90'"
在线
self.habit?.trackingType = index
过去 2 天我一直在努力解决这个问题。
编辑:
模型习惯初始化如下
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!;
}
返回的列表在应用程序中无处不在。基本上我从列表中获取和项目并更新它的属性然后再次保存它
好的,所以您收到错误的原因很可能是因为 self.habit
引用的对象不是 Habit
对象。找出对象真正是什么的最简单方法是调用:
print(NSStringFromClass(habit.class))
对于核心数据和自定义 NSManagedObjects
,您需要确保实体:'Habit'(在您的数据模型中)将 class 设置为习惯。这可以确保 Core Data 将实体描述为 'Habit' 的获取对象转换为习惯 class。如果您不这样做,那么 getHabits
函数将返回一个 NSManagedObject
的数组,而不是 Habit
s.If 的数组,情况就是这样,那么代码:println(NSStringFromClass(habit.class))
将向调试器打印 "NSManagedObject"。
附带说明一下,当您从 Core Data 数据库中获取对象时,您确实需要检查错误。添加行:
if objects? == nil {
print("An error occurred \error.localisedDescription")
}
如有错误请见谅我的swift,我一般都是用Objective-C。
编辑:为了更正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
和 awakeFromFetch
methods/functions.
每当我尝试更新核心数据模型的值时,我总是收到此错误。 这是我的模型
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
}
我一直收到错误 "Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Habit setTrackingType:]: unrecognized selector sent to instance 0x7fdcbb002c90'"
在线 self.habit?.trackingType = index
过去 2 天我一直在努力解决这个问题。
编辑:
模型习惯初始化如下
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!;
}
返回的列表在应用程序中无处不在。基本上我从列表中获取和项目并更新它的属性然后再次保存它
好的,所以您收到错误的原因很可能是因为 self.habit
引用的对象不是 Habit
对象。找出对象真正是什么的最简单方法是调用:
print(NSStringFromClass(habit.class))
对于核心数据和自定义 NSManagedObjects
,您需要确保实体:'Habit'(在您的数据模型中)将 class 设置为习惯。这可以确保 Core Data 将实体描述为 'Habit' 的获取对象转换为习惯 class。如果您不这样做,那么 getHabits
函数将返回一个 NSManagedObject
的数组,而不是 Habit
s.If 的数组,情况就是这样,那么代码:println(NSStringFromClass(habit.class))
将向调试器打印 "NSManagedObject"。
附带说明一下,当您从 Core Data 数据库中获取对象时,您确实需要检查错误。添加行:
if objects? == nil {
print("An error occurred \error.localisedDescription")
}
如有错误请见谅我的swift,我一般都是用Objective-C。
编辑:为了更正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
和 awakeFromFetch
methods/functions.