How come I can cast to NSManagedObject but not to my entity's type?

后端 未结 8 1467
粉色の甜心
粉色の甜心 2020-12-01 13:36

I\'m using the Swift boilerplate code for Core Data in a fresh project. My .xcdatamodeld file has a single entity defined (Task) with a single attr

相关标签:
8条回答
  • 2020-12-01 14:10

    An update for @Ben Gottlieb answer under XCode 7.1 and Swift 2.0

    1. add @objc to your class. See Owen Zhao's answer. The following is an example:
    @objc
    class ImageRecordMO: NSManagedObject{
    
    1. Open your .xcdatamodled file.

    2. Select your entity and click the data model inspector on the right panel.

    3. Enter the class name, see the figure below

    4. Select your module to be Current Product Module, see the figure below.

    0 讨论(0)
  • 2020-12-01 14:13

    This is even frustrated if you tried all the above suggestions and non of them working for me!!

    So this is what works for me.

    1- Select your xcdatamodeld file

    2- Make sure that all your entities has No Module in the "Data Model Inspector", if you see "Model: Current Product Module" ..clear it it so it looks like the attached image.

    3- Delete your App to clear core data

    4- If still not working, delete your entities and regenerate them.

    0 讨论(0)
  • 2020-12-01 14:13

    I've run into this problem in the last few days and strangely the solution that worked for me was a variant of that suggested above.

    I added the @objc declaration to the generated subclasses, but removed any namespace prefix in the class name in the object model (it had a default prefix of "PRODUCT_MODULE_NAME." after the subclasses were generated). That worked.

    0 讨论(0)
  • 2020-12-01 14:21

    I guess only changing the class field in the .xcdatamodel doesn't work anymore because I still got the following exception: fatal error: use of unimplemented initializer 'init(entity:insertIntoManagedObjectContext:)' for class

    So, I entered this code in my custom class:

        init(entity: NSEntityDescription!,
        insertIntoManagedObjectContext context: NSManagedObjectContext!) {
            super.init(entity: entity, insertIntoManagedObjectContext: context)
    }
    

    Suddenly, it worked! The NSManagedObject is now down-castable to my custom class. I can't really understand why this is the solution, but it works :)

    0 讨论(0)
  • 2020-12-01 14:23

    You need to modify your Task.swift file. Adding @objc(Task) like below

    import CoreData
    
    @objc(Task)
    class Task: NSManagedObject {
        @NSManaged var name: String
    }
    

    I think this as a bug if your project does not contain any objective-c codes. However, you need to add that line until this fixed.

    I learned it from here.

    Youtube video at 11:45

    0 讨论(0)
  • 2020-12-01 14:25

    Xcode 7 + Swift 2

    Person.swift

    @objc(Person)
    class Person: NSManagedObject {
    }
    

    Data model

    Then simply call

    let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: self.managedObjectContext) as! Person
    
    0 讨论(0)
提交回复
热议问题