2016-06-22 15 views
8

Mam problemy z danymi podstawowymi w Xcode 8 beta 1. Stare aplikacje będą się kompilować i działać poprawnie, ale wszystkie nowe aplikacje będą kompilować i działać poprawnie, dopóki nie spróbują wstawić nowy obiekt NSManagedObject.Model Core Data nie pojawia się w aplikacji

Początkowo myślałem, że ma to coś wspólnego z niepoprawnym usunięciem starego xcdatamodelu i przerobieniem innego, ale po zrobieniu zupełnie nowej aplikacji i stworzeniu prostego Entity "A", nie jestem w stanie stworzyć obiektu klasy A w środowisko wykonawcze.

Próbowałem, używając let a = A(context: myMOC) która zwraca błąd:

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

Próbując starą let a = NSEntityDescription.insertNewObject(forEntityName: "A", into: context) as! A zwraca błąd:

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

Sprawdziłem mój xcdatamodel kilkanaście razy, aby upewnić się, że zostały napisane wszystko poprawnie i utworzyłem nowy projekt do przetestowania, aby upewnić się, że nie popełniłem żadnych błędów podczas konfigurowania dysku CD. Myśli?

UPDATE: Zawartość opakowania xcdatamodel są to:

<?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: Drukowanie jednostek managedObjectModel, ukazuje, że poprawny model jest załadowany. Nadal nie mogę uzyskać obiektu NSManagedObject do zainicjowania w dowolnym nowym projekcie.

+0

Drugi wymieniony błąd jest tym, czego oczekiwałbym, gdyby niestandardowa nazwa/moduł klasy nie został poprawnie wypełniony w modelu danych. Czy zweryfikowałeś, że są one poprawne? –

+0

Zweryfikowałem wiele razy. Przetestowałem każdy podmiot, który posiadam i otrzymuję te same błędy. – jjatie

+0

Dodaj zawartość pliku XML swojego modelu danych do pliku Q. Znajdziesz go w pakiecie xcdatamodel. Możesz też dodać zrzut ekranu edytora modeli. –

Odpowiedz

14

końcu zorientowaliśmy się:

W Xcode 7 trzeba by wprowadzić nazwę klasy, a Swift, ustaw moduł do „bieżącego modułu Project”. Zakładam, że nie będzie to już konieczne w Xcode 8, ponieważ automatycznie generuje pliki źródłowe. Musisz ręcznie ustawić nazwę klasy na nazwę generowanej klasy, aby Xcode wygenerował @objc(ClassName) (nie mam pojęcia, dlaczego potrzebuje tej adnotacji - ręcznie tworzone klasy dla encji CoreData działają bez tego dla mnie). Ponadto NIE musisz ręcznie ustawiać modułu, ponieważ w przeciwnym razie Xcode nie może już znaleźć wygenerowanej klasy.

enter image description here

+0

Dzięki! Nie ma mnie przez kilka dni. Wypróbuję to, kiedy wrócę do domu i przyjmuję twoją odpowiedź. – jjatie

+5

Miałem ten sam problem "*** Kończenie aplikacji z powodu nieprzechwyconego wyjątku" NSInvalidArgumentException ", powód:" Obiekt NSManagedObject klasy "MyAp.MyClass" musi mieć poprawny NSEntityDescription. "" Musiałem dodać '@objc (MyClass) 'na początek mojej klasy obiektów zarządzanych. – masters3d

+0

To samo działało dla mnie jako masters3d. Umieszczasz @objc (MyClass) na linii, zanim napiszesz klasę MyClass: NSManagedObject {// ...}, a problem zniknął – horseshoe7

1

Miałem ten sam błąd. W moim przypadku musiałem wystawić klasę Swift na środowisko wykonawcze ObjectiveC. Aby to zrobić, należy dodać @objc(ModelClass) przed Swift deklaracji klasy, co następuje:

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

Poprawianie nazwę NSPersistentContainer w AppDelegate pracował dla mnie.

let container = NSPersistentContainer(name: "sampleDataModel") 
Powiązane problemy