2016-06-22 15 views
8

Ho difficoltà con Core Data in Xcode 8 beta 1. Le vecchie app si compilano e funzionano bene, ma tutte le nuove app si compilano e funzionano bene fino al tentativo di inserire un nuovo NSManagedObject.Il Core Data Model non sembra essere riflesso nell'app

Inizialmente pensavo che avesse qualcosa a che fare con l'eliminazione errata di un vecchio xcdatamodel e il rifacimento di un altro, ma dopo aver creato un'app nuovissima e aver creato una semplice Entità "A", non sono in grado di creare un oggetto di classe A in runtime.

Ho provato con let a = A(context: myMOC) che restituisce l'errore:

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

Cercando il vecchio let a = NSEntityDescription.insertNewObject(forEntityName: "A", into: context) as! A restituisce l'errore:

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

Ho controllato il mio xcdatamodel una dozzina di volte per assicurarsi che ho scritto tutto correttamente, e ho creato un nuovo progetto da testare per assicurarmi di non aver commesso errori nella configurazione del CD. Pensieri?

AGGIORNAMENTO: Il contenuto della confezione xcdatamodel sono questo:

<?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: stampa entità del managedObjectModel, dimostra che il modello corretto viene caricata. Ancora non riesco a ottenere un NSManagedObject per l'inizializzazione in qualsiasi nuovo progetto.

+0

Il secondo errore che hai elencato è quello che mi aspetterei se il nome/modulo della classe personalizzata non venisse compilato correttamente nel modello di dati. Hai verificato che sono corretti? –

+0

Ho verificato più volte. Ho testato tutte le entità che ho e ottengo gli stessi errori. – jjatie

+0

Si prega di aggiungere il contenuto dell'XML del modello dati al Q. Lo si trova all'interno del pacchetto xcdatamodel. In alternativa aggiungi uno screenshot dell'editor del modello. –

risposta

14

ho finalmente capito:

In Xcode 7 si dovrà inserire il nome della classe e, a Swift, impostare il modulo "Modulo Progetto corrente". Supponevo che non sarebbe più necessario in Xcode 8, poiché genera automaticamente i file sorgente. Devi però impostare manualmente il nome della classe sul nome della classe generata, per fare in modo che Xcode generi lo @objc(ClassName) (non ho idea del motivo per cui ha bisogno di quell'annotazione - le classi create manualmente per le entità CoreData funzionano senza di esso). Inoltre NON devi impostare manualmente il modulo, altrimenti Xcode non può più trovare la classe generata.

enter image description here

+0

Grazie! Sono via per un paio di giorni. Lo metterò alla prova quando torno a casa e accetterò la tua risposta. – jjatie

+5

Avevo lo stesso problema '*** Terminazione dell'app a causa di eccezione non rilevata 'NSInvalidArgumentException', motivo: 'Un NSManagedObject di classe' MyAp.MyClass 'deve avere una NSEntityDescription valida.'' Ho dovuto aggiungere' @objc (MyClass) 'all'inizio della mia classe dell'oggetto di gestione. – masters3d

+0

Stesso lavoro per me come masters3d. Hai messo @objc (MyClass) sulla riga prima di scrivere la classe MyClass: NSManagedObject {// ...} e il problema è andato via – horseshoe7

1

Stavo facendo lo stesso errore. Nel mio caso avevo bisogno di esporre la classe Swift al runtime ObjectiveC. Per fare questo, aggiungere @objc(ModelClass) prima della dichiarazione di classe Swift, come segue:

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

rettificare il nome NSPersistentContainer in AppDelegate ha lavorato per me.

let container = NSPersistentContainer(name: "sampleDataModel") 
Problemi correlati