使用Core Data Swift发送到实例的无法识别的选择器

时间:2015-02-14 10:14:17

标签: ios objective-c iphone swift core-data

每当我尝试更新核心数据模型的值时,我都会遇到此错误。 这是我的模特

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!;
    }

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

1 个答案:

答案 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上下文参数。但是,如果您想要撤消管理以及将对象保存到数据库的能力,则需要将其与上下文相关联。

如果您想对对象进行自定义初始化,则可以覆盖nilawakeFromInsert方法/函数。