2016-06-22 5 views
8

У меня возникают трудности с Core Data в Xcode 8 beta 1. Старые приложения будут компилироваться и работать нормально, но все новые приложения компилируются и работают нормально, пока не попытается вставить новый NSManagedObject.Модель базовых данных не отображается в приложении

Первоначально я думал, что это как-то связано с неправильным удалением старого xcdatamodel и переделкой другого, но после создания совершенно нового приложения и создания простой сущности «A» я не могу создать объект класса A на во время выполнения.

Я попытался с помощью let a = A(context: myMOC), который возвращает ошибку:

An NSManagedObject of class 'MyApp.A' must have a valid NSEntityDescription.

Попытка старого let a = NSEntityDescription.insertNewObject(forEntityName: "A", into: context) as! A возвращает ошибку:

Could not cast value of type 'NSManagedObject_A_' (0x7fd114626f80) to 'MyApp.A' (0x10d2fdf28).

Я проверил мое xcdatamodel десяток раз, чтобы убедиться, я прописана все правильно, и создали новый проект для проверки, чтобы убедиться, что я не делал никаких ошибок при настройке компакт-диска. Мысли?

UPDATE: Содержание xcdatamodel пакета являются это:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="11147.23" systemVersion="16A201w" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier=""> 
    <entity name="Coordinate" syncable="YES" codeGenerationType="class"> 
     <attribute name="latitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES" syncable="YES"/> 
     <attribute name="longitude" optional="YES" attributeType="Double" defaultValueString="0.0" usesScalarValueType="YES" syncable="YES"/> 
     <relationship name="route" optional="YES" maxCount="1" deletionRule="Nullify" destinationEntity="Route" inverseName="coordinates" inverseEntity="Route" syncable="YES"/> 
    </entity> 
    <entity name="Route" syncable="YES" codeGenerationType="class"> 
     <attribute name="uuid" optional="YES" attributeType="String" syncable="YES"/> 
     <relationship name="coordinates" optional="YES" toMany="YES" deletionRule="Nullify" ordered="YES" destinationEntity="Coordinate" inverseName="route" inverseEntity="Coordinate" syncable="YES"/> 
    </entity> 
    <elements> 
     <element name="Route" positionX="-45" positionY="0" width="128" height="75"/> 
     <element name="Coordinate" positionX="-18" positionY="27" width="128" height="90"/> 
    </elements> 
</model> 

UPDATE 2: Печать объектов в managedObjectModel, в показывает, что правильная модель загружается. Тем не менее я не могу получить NSManagedObject для инициализации в любом новом проекте.

+0

Вторая ошибка, которую вы указали, - это то, что я ожидал бы, если пользовательское имя класса/модуль не будет правильно заполнено в модели данных. Вы подтвердили, что они верны? –

+0

Я проверил несколько раз. Я тестировал каждый объект, который у меня есть, и получаю те же ошибки. – jjatie

+0

Пожалуйста, добавьте содержимое XML вашей модели данных в Q. Вы найдете его внутри пакета xcdatamodel. Альтернативно добавьте снимок экрана редактора модели. –

ответ

14

Я наконец понял это:

В Xcode 7 вы должны ввести имя класса и, в Swift, установите модуль «Модуль Project Current». Я предположил, что больше не понадобится в Xcode 8, поскольку он автоматически генерирует исходные файлы. Вам нужно вручную задать имя класса для имени сгенерированного класса, хотя для того, чтобы Xcode сгенерировал @objc(ClassName) (я понятия не имею, зачем нужна эта аннотация - вручную созданные классы для объектов CoreData работают без него). Также вы НЕ должны вручную устанавливать модуль, потому что иначе Xcode больше не сможет найти сгенерированный класс.

enter image description here

+0

Спасибо! Я уезжаю на пару дней. Я проверю это, когда вернусь домой и приму свой ответ. – jjatie

+5

У меня была такая же проблема '*** Завершение приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: 'NSManagedObject класса' MyAp.MyClass 'должен иметь действительный NSEntityDescription.'' Мне пришлось добавить' @objc (MyClass) 'до вершины моего класса класса управления. – masters3d

+0

Так же работал для меня как master3d. Вы помещаете @objc (MyClass) в строку перед тем, как писать класс MyClass: NSManagedObject {// ...}, и проблема исчезла – horseshoe7

1

У меня была такая же ошибка. В моем случае мне нужно было открыть класс Swift для среды выполнения ObjectiveC. Чтобы сделать это, добавьте @objc(ModelClass) до объявления Swift класса, а именно:

@objc(Player) 
class Player: NSManagedObject { 
} 
0

исправляющего имя NSPersistentContainer в AppDelegate работал для меня.

let container = NSPersistentContainer(name: "sampleDataModel")