Я работаю над разработкой приложения с 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?
Редактировать:
Я указал класс сущности, как на следующем скриншоте:
ios
core-data
swift
nsmanagedobject
MsrButterfly
источник
источник
Ответы:
Обновление для Xcode 7 (окончательное): добавление имени модуля к классу (как в Xcode 6 и ранних бета-версиях Xcode 7) больше не требуется. Документация Apple, реализующая базовые подклассы управляемых данных , была обновлена соответствующим образом.
Инспектор модели данных теперь имеет два поля «Класс» и «Модуль» для объекта:
При создании подкласса управляемого объекта Swift для сущности в поле «Модуль» устанавливается «Текущий модуль продукта», и с этим параметром создание экземпляров работает как в основном приложении, так и в модульных тестах. Подкласс управляемого объекта не должен быть отмечен
@objc(classname)
(это было отмечено в https://stackoverflow.com/a/31288029/1187415 ).В качестве альтернативы вы можете очистить поле «Модуль» (оно будет отображать «Нет») и пометить подклассы управляемого объекта с помощью
@objc(classname)
(это наблюдалось в https://stackoverflow.com/a/31287260/1187415 ).Примечание: Этот ответ был изначально написан для Xcode 6. В этой бета-версии произошли некоторые изменения, связанные с этой проблемой. Поскольку это принятый ответ со многими ответами и ссылками на него, я попытался суммировать ситуацию для текущей финальной версии Xcode 7.
Я провел свое собственное «исследование» и прочитал все ответы на этот вопрос и на аналогичный вопрос CoreData: warning: Невозможно загрузить класс named . Таким образом, авторство относится ко всем из них, даже если я не перечислю их конкретно!
Предыдущий ответ для Xcode 6 :
Как описано в разделе « Реализация подклассов управляемых объектов базовых данных», необходимо добавить префикс имени класса сущностей в поле «Класс» в инспекторе сущностей модели к имени вашего модуля, например «MyFirstSwiftApp.User».
источник
@objc(ClassName)
метод, предложенный в ответе Кристера.Просто как примечание. Я была такая же проблема. И все, что мне нужно было сделать, это добавить
@objc(ClassName)
в мой файл класса.Пример:
И это решило мою проблему.
источник
Принятый ответ на этот вопрос помог мне решить ту же проблему, но у меня было предостережение, которое, как я думал, будет полезно для других. Если в имени вашего проекта (модуля) есть пробел, вы должны заменить пробел подчеркиванием. Например:
Entity: MyEntity Class: My_App_Name.MyClass
источник
Не забудьте удалить свой модуль :
источник
В зависимости от того, работаете ли вы как приложение или тесты, проблема может заключаться в том, что приложение ищет,
<appName>.<entityName>
а когда оно запускается как тест, оно выглядит так<appName>Tests.<entityName>
. Решение, которое я использую в это время (Xcode 6.1), состоит в том, чтобы НЕ заполнятьClass
поле в пользовательском интерфейсе CoreData, а вместо этого делать это в коде.Этот код определит, работаете ли вы как App vs Tests, используете правильное имя модуля и обновите
managedObjectClassName
.источник
Если вы используете дефис в названии своего проекта, например, «My-App», тогда используйте дефис, например «My_App.MyManagedObject», вместо подчеркивания. В общем, посмотрите на имя файла xcdatamodeld и используйте тот же префикс, что и в этом имени. Т.е. для "My_App_1.xcdatamodeld" требуется префикс "My_App_1"
источник
Это может помочь тем, кто испытывает ту же проблему. Я был со Swift 2 и Xcode 7 beta 2.
Решением в моем случае было закомментировать
@objc(EntityName)
вEntityName.swift
.источник
У меня было то же предупреждение, хотя мое приложение работало нормально. Проблема заключалась в том, что при запуске Editor> Create NSManagedObject Subclass на последнем экране я использовал расположение группы по умолчанию, при этом целевые объекты не отображались и не проверялись, что сохраняло подкласс в верхнем каталоге MyApp, где находился MyApp.xcodeproj.
Предупреждение исчезло, когда я вместо этого изменил группу на подпапку MyApp и проверил цель MyApp.
источник
Приведенные выше ответы были полезны. Эта быстрая проверка работоспособности может сэкономить вам время. Перейдите в Project> Build Phases> Compile Sources и удалите xcdatamodeld и файлы модели с помощью кнопки «-», а затем добавьте их обратно с помощью кнопки «+». Восстановить - это может позаботиться об этом.
источник
Кстати, будьте осторожны с тем, что вы добавляете в качестве префикса: мое приложение называется «ABC-def», а Xcode преобразовал «-» в «_».
Чтобы быть в безопасности, загляните в искатель, найдите файлы вашего проекта и посмотрите, что он говорит для вашей модели данных (например, «ABC_def.xcdatamodeld»), и используйте то, что там написано, ТОЧНО !!!
источник
Приведенные выше ответы помогли мне решить другую проблему, связанную с Objective-C (может, кому-то это поможет):
Если вы реорганизовали имена сущностей, не забудьте также изменить «Класс» на «Панели утилит».
источник
Приведенные выше ответы помогли мне, но это может кому-то помочь. Если вы, как и я, сделали это и все еще испытываете проблемы, не забудьте просто «очистить свой проект». Для XCode8, Product> Clean. Тогда беги снова.
источник
В Xcode 7 имена сущностей и классов могут быть одинаковыми, но Codegen должен иметь определение класса. В этом случае не будет предупреждений и т. Д. Введите описание изображения здесь
источник