【问题标题】:unrecognized selector sent to instance with Coredata Swift使用 Coredata Swift 将无法识别的选择器发送到实例
【发布时间】:2015-04-15 09:02:57
【问题描述】:

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

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:]: 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 在哪里/如何初始化?也许你没有使用 designated initializer init(entity: , insertIntoManagedObjectContext:) ?比较stackoverflow.com/questions/23835525/…
  • 我已经浏览了所有这些链接,但它们都无济于事。我已经为您的 cmets 编辑了我的问题
  • 我认为这与内存有关,但我无法迅速弄清楚
  • index 是如何定义的?
  • 你是否自动生成了类?

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


【解决方案1】:

好的,所以您收到错误的原因肯定是因为self.habit 引用的对象不是Habit 对象。找出对象到底是什么的最简单方法是调用:

print(NSStringFromClass(habit.class))

使用核心数据和自定义NSManagedObjects,您需要确保实体:“习惯”(在您的数据模型中)有一个设置为习惯的类。这可以确保 Core Data 将您获取的具有“习惯”实体描述的对象转换为习惯类。如果你不这样做,那么getHabits 函数将返回一个NSManagedObjects 数组而不是Habits 数组。如果是这种情况,那么代码: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 方法/函数。

【讨论】:

  • 如果self.habit我把代码改成了下面的'code'? != nil { NSLog(NSStringFromClass(self.habit?.classForCoder)) self.habit?.trackingType = index } 'code' 并将类名正确打印为习惯。 CoreData:错误:无法在 NSManagedObject 类“习惯”习惯上调用指定的初始化程序 - [习惯 setTrackingType:]:无法识别的选择器发送到实例 0x7fe452299010 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[习惯 setTrackingType: ]: 无法识别的选择器发送到实例'
  • 您是否在任何地方致电 self.habit = [[Habit alloc] init];(或 swift 等价物)?错误:Failed to call designated initializer on NSManagedObject class 通常意味着您错误地初始化了 Habit 对象。而不是allocinit,您需要致电:initWithEntity:insertIntoManagedObjectContext:。如果您不希望 Habit 对象与上下文相关联,则可以通过 nilNSManagedObjectContext 传递。请参阅我的代码编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多