一尘不染

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

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

    }

我不断收到错误消息 “由于未捕获的异常’NSInvalidArgumentException’而终止应用程序,原因:’-[Habit
setTrackingType:]:无法识别的选择器发送到实例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!;
    }

返回的列表可在应用程序中的任何地方使用。基本上,我从列表中获取项目并更新其属性,然后再次保存


阅读 301

收藏
2020-07-07

共1个答案

一尘不染

好的,因此得到错误的原因很可能是因为所引用的对象self.habit不是Habit对象。找出对象实际的最简单方法是调用:

print(NSStringFromClass(habit.class))

对于核心数据和自定义,NSManagedObjects您需要确保实体:“习惯”(在数据模型中)具有设置为“习惯”的类。这可以确保Core
Data将具有“
Habit”的实体描述的获取的对象强制转换为Habit类。如果您不这样做,则getHabits函数将返回NSManagedObjects
的数组而不是s的数组。Habit如果是这种情况,则代码:println(NSStringFromClass(habit.class))将向调试器输出“
NSManagedObject”。

附带说明,从Core Data数据库获取对象时,您确实需要检查错误。添加行:

if objects? == nil {
    print("An error occurred \error.localisedDescription")
}

如果有任何错误,请原谅我,我通常使用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上下文参数传递。但是,如果要撤消管理并具有将对象保存到数据库的功能,则需要将其与上下文关联。

如果要自定义对象的初始化,则可以覆盖awakeFromInsertawakeFromFetch方法/函数。

2020-07-07