ios - 使用 Coredata Swift 发送到实例的无法识别的选择器

标签 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’而终止应用程序,原因:‘-[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!;
    }

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

最佳答案

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

print(NSStringFromClass(habit.class))

对于核心数据和自定义 NSManagedObjects,您需要确保实体:'Habit'(在您的数据模型中)有一个设置为 Habit 的类。这确保了 Core Data 将您获取的带有“习惯”实体描述的对象转换为习惯类。如果您不这样做,那么 getHabits 函数将返回一个 NSManagedObject 数组,而不是一个 Habit 数组。如果这是case 然后代码: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 上下文参数。但是,如果您想要撤消管理以及将对象保存到数据库的能力,则需要将其与上下文相关联。

如果你想对一个对象进行自定义初始化,那么你可以覆盖 awakeFromInsertawakeFromFetch 方法/函数。

关于ios - 使用 Coredata Swift 发送到实例的无法识别的选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514543/

相关文章:

ios - 什么时候应该屏蔽 UITableView 部分单元格的角?

ios - 替换拍摄并重新拍摄按钮UIImagePickerController

ios - 如何像 SKNode 一样编辑 NSArray 对象

iphone - 使用 Accelerate 框架进行 FFT 时如何设置缓冲区?

ios - 如何在swift中引用NSObject类中的viewcontroller?

ios - 如何使用私有(private)框架解锁 iOS 设备?

ios - 从 SKScene 转到 Storyboard,创建旧场景的实例

objective-c - NSImage : Change brightness

objective-c - 跟踪系统事件

iphone - 如何获取电池状态?