ios - update - xcode delete core data




無法找到NSManagedObject的特定子類 (9)

更新Xcode 7(final):將模塊名稱添加到類中(如Xcode 6和Xcode 7的早期beta版本)不再需要。 Apple文檔實現核心數據管理對象子類已相應更新。

數據模型檢查器現在為實體提供了兩個“類”和“模塊”字段:

當為實體創建Swift託管對象子類時,“模塊”字段設置為“當前產品模塊”,並且使用此設置創建實例既可以在主應用程序中執行,也可以在單元測試中執行。 託管對象子類不能@objc(classname)標記(這在https://stackoverflow.com/a/31288029/1187415中可以看到)。

或者,您可以清空“模塊”字段(它將顯示“無”),並使用@objc(classname)標記託管對象子@objc(classname) (可在https://stackoverflow.com/a/31287260/1187415 @objc(classname) )。

備註:這個答案最初是為Xcode 6編寫的。關於這個問題,各種Xcode 7 beta版本發生了一些變化。 由於它是一個被接受的答案,有許多提議和鏈接,我試圖總結當前Xcode 7最終版本的情況。

我做了我自己的“研究”,並閱讀了這個問題和類似問題CoreData的所有答案:警告:無法加載類名 。 所以歸屬於所有人,即使我沒有專門列出它們!

以前的答案Xcode 6

實現核心數據管理對象子類中所述 ,必須在模型實體檢查器的類字段中將實體類名稱作為模塊名稱的前綴,例如“MyFirstSwiftApp.User”。

我正在開發使用Core Data的應用程序。 當我使用以下方法創建實例時:

let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)

我在日誌中收到警告:

CoreData: warning: Unable to load class named 'User' for entity 'User'.  Class not found, using default NSManagedObject instead.

我怎麼修復它?

還有一個問題,我如何在NSManagedObject子類中定義一個實例方法?

編輯:

我已經在下面的截圖中指定了實體的類:


上述答案很有幫助。 這種快速完整性檢查可以為您節省一些時間。 進入Project> Build Phases> Compile Sources並使用“ - ”按鈕刪除xcdatamodeld和您的模型文件,然後使用“+”按鈕直接添加它們。 重建 - 可能會照顧它。


上面的答案幫助我解決了與Objective-C有關的不同問題(也許它會幫助某人):

如果您重構了實體名稱,請不要忘記在“實用程序面板”中更改“Class”。


在Xcode 7中,實體和類名可以相同,但Codegen應該是類定義。 在這種情況下,將不會有任何警告等


對這個問題的接受答案幫助我解決了同樣的問題,但我有一個警告,我認為會對其他人有所幫助。 如果您的項目(模塊)名稱中有空格,則必須用下劃線替換空格。 例如:

實體:MyEntity類:My_App_Name.MyClass


就像一個旁注。 我遇到過同樣的問題。 而我所要做的只是在我的課堂文件中添加@objc(ClassName)

例:

@objc(Person)
class Person { }

這解決了我的問題。


記得要刪除你的模塊


這取決於如果你正在運行應用程序vs測試,問題可能在於應用程序正在尋找<appName>.<entityName>並且當它運行時,它看起來像<appName>Tests.<entityName> 。 我現在使用的解決方案(Xcode 6.1)不是在CoreData UI中填充Class字段,而是使用代碼來完成。

此代碼將檢測您是否以App vs Tests身份運行,並使用正確的模塊名稱並更新managedObjectClassName

lazy var managedObjectModel: NSManagedObjectModel = {
    // The managed object model for the application. This property is not optional...
    let modelURL = NSBundle.mainBundle().URLForResource("Streak", withExtension: "momd")!
    let managedObjectModel = NSManagedObjectModel(contentsOfURL: modelURL)!

    // Check if we are running as test or not
    let environment = NSProcessInfo.processInfo().environment as [String : AnyObject]
    let isTest = (environment["XCInjectBundle"] as? String)?.pathExtension == "xctest"

    // Create the module name
    let moduleName = (isTest) ? "StreakTests" : "Streak"

    // Create a new managed object model with updated entity class names
    var newEntities = [] as [NSEntityDescription]
    for (_, entity) in enumerate(managedObjectModel.entities) {
        let newEntity = entity.copy() as NSEntityDescription
        newEntity.managedObjectClassName = "\(moduleName).\(entity.name)"
        newEntities.append(newEntity)
    }
    let newManagedObjectModel = NSManagedObjectModel()
    newManagedObjectModel.entities = newEntities

    return newManagedObjectModel
}()

順便說一句,你添加的前綴是:我的應用程序被稱為“ABC-def”,Xcode已將“ - ”轉換為“_”。

為了安全查找發現者,找到你的項目文件,看看它對你的數據模型說了什麼(例如“ABC_def.xcdatamodeld”),並使用那裡寫的是什麼!





nsmanagedobject