无法访问属性NSManagedObject

时间:2015-10-26 07:51:14

标签: ios core-data

我在访问NSManagedObjectContext中的属性时遇到问题。

我创建并创建了“Module”类的子类。 如果我想创建模块,一切都很好。

但如果我想访问“state” - 属性ig got:

2015-10-26 10:05:46.041 StudyGraph[84862:23335247] -[StudyGraph.Module processingState]: unrecognized selector sent to instance 0x7f97d2e3bb00

这是模型。 Model

ManagedObject-亚纲:

import Foundation
import CoreData

enum ModuleState: Int16 {
    case Open
    case Active
    case Done
}

class Module: NSManagedObject {

    var moduleState: ModuleState {
        get {
            return ModuleState(rawValue: processingState)!  // Here it stops !!!
        }
        set {
            processingState = newValue.rawValue
        }
    }

    class func create(context: NSManagedObjectContext, title: String) -> Module? {
        if let newModule = NSEntityDescription.insertNewObjectForEntityForName("Module", inManagedObjectContext: context) as? Module {
            //  Set values
            newModule.title = title

            //  Save
            do {
                try newModule.managedObjectContext?.save()
            } catch {
                print("Error while saving new Module.")
            }

            // return
            print(newModule)
            return newModule
        }
        return nil
    }

    func progress() -> Float {
        return 0.25
    }
}

扩展:

import Foundation
import CoreData

extension Module {

    @NSManaged var processingState: Int16
    @NSManaged var title: String?

}

调用getter的代码:

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if let cell = tableView.dequeueReusableCellWithIdentifier("ModuleCell") as? ModuleTableViewCell {
            if let cellObject = dataManager.objectAtIndexPath(indexPath) as? Module {
                cell.titleLabel?.text = cellObject.title
                cell.progressIndicator?.progress = cellObject.progress()
                print(cellObject.moduleState)
                return cell
            }

        }

        let dummy = UITableViewCell(style: .Default, reuseIdentifier: "DUMMY")
        dummy.textLabel?.text = "DUMMY"
        return dummy
    }
DataManager中的

func objectAtIndexPath(indexPath: NSIndexPath) -> NSManagedObject? {
    if let frc = self.fetchedResultsController {
        if let obj = frc.objectAtIndexPath(indexPath) as? NSManagedObject {
            return obj
        }
    }
    return nil
}

1 个答案:

答案 0 :(得分:0)

对于模型中定义的属性state,您必须在子类中声明@NSManaged变量。核心数据隐式地创建了适当的setter和getter。

@NSManaged var state: Int16

并声明第二个变量将枚举值转换为Int16,反之亦然。

var moduleState: ModuleState {
  get {
    return ModuleState(rawValue: state)!
  }
  set {
    state = newValue.rawValue
  }
}

要避免类型转换,请将枚举类型声明为Int16

enum ModuleState: Int16 { … }

您可以使用变量getModuleState()

代替函数moduleState

我还建议将模型中的属性state声明为非可选