ios урок - Не удалось найти конкретный подкласс NSManagedObject





core data (12)


Если вы используете дефис в имени вашего проекта, например «My-App», используйте знак подчеркивания вместо дефиса, например «My_App.MyManagedObject». В общем, посмотрите имя файла xcdatamodeld и используйте тот же префикс, что и в этом имени. Т.е. для «My_App_1.xcdatamodeld» требуется префикс «My_App_1»

Я работаю над разработкой приложения с помощью 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 (возможно, это поможет кому-то):

Если вы реорганизовали имена сущностей, не забудьте также изменить «Класс» в «Панель служебных программ».




Как примечание. Я была такая же проблема. И все, что я должен был сделать, это добавить @objc(ClassName) в мой файл класса.

Пример:

@objc(Person)
class Person { }

И это решило мою проблему.




Не забудьте удалить свой модуль :







Это может помочь тем, кто испытывает ту же проблему. Я был с Swift 2 и Xcode 7 beta 2.

Решение в моем случае состояло в том, чтобы прокомментировать @objc(EntityName) в EntityName.swift .




Кстати, будьте внимательны, что вы добавляете в качестве префикса: My App называется «ABC-def», а Xcode превратил «-» в «_».

Чтобы быть уверенным в поиске искателя, найдите файлы проекта и посмотрите, что он говорит для вашей модели данных (например, «ABC_def.xcdatamodeld») и используйте то, что там написано ТОЧНО !!!




Принятый ответ на этот вопрос помог мне решить ту же проблему, но у меня было предостережение, которое, по моему мнению, было бы полезно для других. Если в имени вашего проекта (модуля) есть пробел, вы должны заменить пробел знаком подчеркивания. Например:

Объект: класс MyEntity: My_App_Name.MyClass




У меня было то же предупреждение, хотя мое приложение, похоже, отлично работало. Проблема заключалась в том, что при запуске Editor> Create NSManagedObject Subclass на последнем экране я использовал местоположение группы по умолчанию, без каких-либо целевых объектов, которые были отображены или отмечены, и сохранили подкласс в верхней директории MyApp, где находился MyApp.xcodeproj.
Предупреждение исчезло, когда я вместо этого изменил группу, чтобы быть в подпапке MyApp, и проверил цель MyApp.




В зависимости от того, что вы используете как приложение vs Tests, проблема может заключаться в том, что приложение ищет <appName>.<entityName> а когда оно выполняется как тест, оно выглядит как <appName>Tests.<entityName> . Решение, которое я использую в это время (Xcode 6.1), НЕ должно заполнить поле Class в интерфейсе CoreData и сделать это вместо кода.

Этот код обнаружит, что вы работаете как приложение против тестов и используете правильное имя модуля и обновляете имя 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
}()



Да, вам понадобится MacBook или похожий для разработки для iOS. На мой взгляд, одной из самых больших проблем разработки приложений для iOS является то, что вам регулярно приходится покупать новый MacBook (или другой компьютер на базе Mac), поскольку со временем самая последняя версия xCode для уже устаревшей ОС X X становится несовместимым с новейшей iOS.





ios core-data swift nsmanagedobject