CoreData: aviso: não é possível carregar a class nomeada

Estou duplicando um aplicativo existente do Objective-C TV Show para uma nova versão do Swift usando o Xcode 6.1 e estou tendo alguns problemas com o CoreData.

Eu criei um modelo de 4 entidades, criei sua subclass NSManagedObject (no Swift) e todos os arquivos têm os destinos de aplicativo apropriados definidos (para ‘Compile Sources’).

Ainda estou recebendo esse erro sempre que tento inserir uma nova entidade:

CoreData: aviso: não é possível carregar a class chamada ‘Shows’ para a entidade ‘Shows’. Classe não encontrada, usando o padrão NSManagedObject.

Alguns comentários:

Ao salvar em Core Data, eu uso a maneira de contexto pai-filho para permitir a segmentação em segundo plano. Eu faço isso configurando o ManagedObjectContext usando:

lazy var managedObjectContext: NSManagedObjectContext? = { // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail. let coordinator = self.persistentStoreCoordinator if coordinator == nil { return nil } var managedObjectContext = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.MainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = coordinator return managedObjectContext }() 

e salvando dados usando:

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { () -> Void in var context = NSManagedObjectContext(concurrencyType: NSManagedObjectContextConcurrencyType.PrivateQueueConcurrencyType) context.parentContext = self.managedObjectContext! ...rest of core data saving code here... }) 

Esse aviso é uma das peculiaridades com as quais temos de lidar, enquanto os detalhes da implementação do Swift estão sendo resolvidos. O aviso ocorre falsamente, ou seja, sua configuração pode funcionar mesmo se você não seguir as etapas descritas abaixo.

Eu tenho sido capaz de me livrar dele na maioria dos casos , certificando-se de que a class está definida corretamente no editor do modelo . Ao contrário de muitos outros posts SOF (incluindo respostas a esta pergunta), a sugestão de include o nome do módulo (como MyApp.Shows ) não me ajudou.

Certifique-se de verificar esses três itens:

1
Versão que funciona até o Xcode 7 beta 3

Até o XCode7 b3

Repare que eu corrigi o nome da sua entidade para o singular mais apropriado.

Versão que funciona para o Swift 2.0 no Xcode 7.1
(Deve funcionar para o Xcode 7 beta 4 e acima)

Você precisa excluir o texto “Current Product Module” no módulo!

De Xcode7 beta 3

2
Você também deve seguir a recomendação frequente de include

 @objc(Show) 

logo acima da sua aula.

Nota : Se você estiver usando o Xcode 7 beta 4 ou posterior, esta etapa é opcional.

3
Além disso, certifique-se de converter o object gerenciado criado na class adequada, pois o padrão seria apenas NSManagedObject .

 var newShow = NSEntityDescription.insertNewObjectForEntityForName("Show", inManagedObjectContext: context) as Show 

Atualização SWIFT 2 / XCODE 7:

Esse problema (veja meu comentário de 3 de abril sobre essa resposta também) foi resolvido no lançamento da versão beta do Swift 2 e XCode 7 pela Apple. Então você realmente não precisa do @objc(myEntity) no Swift como respondido pelo Mundi ou usando o ” MyAppName. ” Antes do nome da sua class. Isso vai parar de funcionar. Então remova-os, apenas coloque o nome da Class em File e selecione Current Working Module como Module e cheers!

Selecionando o módulo de trabalho atual

Mas para aqueles que usam @objc(myEntity) no Swift (como eu), você pode usar essa outra solução em vez disso, que funciona sem problemas.

Na class correta xcdatamodel. Deve ficar assim:

Definindo a classe

Aqui está. Module.Class é o padrão para CoreData no Swift e no XCode 6. Você também precisará do mesmo procedimento ao usar a class Política Personalizada no Modelo de Política ou em outro material CoreData. Uma nota: na imagem, o nome e a class devem ser Car e MyAppName.Car (ou qualquer que seja o nome da sua entidade). Aqui, o User é um erro de digitação.

Ao usar o Xcode 7 e puramente Swift, na verdade eu tive que remover @objc(MyClass) da minha subclass NSManagedObject gerada automaticamente (gerada a partir do Editor > Create NSManagedObject Subclass ... ).

No Xcode 7 beta 2 (e acredito 1), na configuração do modelo, um novo object gerenciado do tipo File é definido como Module Current Product Module e a class do object é mostrada na configuração como .File .

Módulo do tipo de objeto gerenciado definido como

Excluir a configuração do módulo para que fique em branco ou remover o ponto final, de forma que o nome da class na configuração seja apenas File são ações equivalentes, pois cada uma delas causa a outra alteração. Salvar esta configuração removerá o erro descrito.

Módulo do objeto gerenciado definido como em branco no Xcode 7

No Xcode 6.1.1, você não precisa adicionar o atributo @objc, já que a entidade base é um subconjunto de uma class objc (NSManagedObject) (consulte Compatibilidade do tipo Swift . Em CoreData, é necessário o nome completo de Module.Class. name é o que é definido em Build Settings -> Packaging -> Product Module Name.Por padrão, isso é definido como $ (PRODUCT_NAME: c99extidentifier), que será o nome do Target .

Com a versão xCode 7 e Swift 2.0, você não precisa adicionar @objc (NameOfClass), apenas altere as configurações da entidade na aba “Mostrar o Data Model Inspector” como abaixo –

Nome – “Seu nome de entidade”

Classe – “Seu nome de entidade”

Módulo – “Módulo do produto atual”

insira a descrição da imagem aqui

Código para o arquivo de class Entity será como (no meu código Entity is Family) –

 import UIKit import CoreData class Family: NSManagedObject { @NSManaged var member : AnyObject } 

Este exemplo está funcionando bem no meu aplicativo com o xCode 7.0 + swift 2.0

Não se esqueça de replace o PRODUCT_MODULE_NAME pelo nome do módulo do produto.

Quando uma nova entidade é criada, você precisa ir até o Inspetor do Modelo de Dados (última guia) e replace o PRODUCT_MODULE_NAME pelo nome do módulo, ou isso resultará em um erro de class not found ao criar o coordenador persistente do repository.

Você também precisa usar (pelo menos com o Xcode 6.3.2) Module.Class ao executar o seu casting, por exemplo: Assumindo que seu módulo (ou seja, nome do produto) é Food e sua class é Fruit

 let myEntity = NSEntityDescription.entityForName("Fruit", inManagedObjectContext: managedContext) let fruit = NSManagedObject(entity: myEntity!, insertIntoManagedObjectContext:managedContext) as! Food.Fruit 

Recapitular:

  • Inclua o nome do módulo ao definir a entidade no Editor de Modelo de Dados (Nome: Fruta, Classe: Food.Fruit)
  • Ao acessar a entidade no código (ieSWIFT), conjure-a com Module.class (por exemplo, Food.Fruit)

Alterar o nome da class de entidade no editor de modelo de dados para corresponder à class em questão e adicionar @objc(NameOfClass) ao arquivo de cada NSManagedObject logo acima da declaração de class resolveu esse problema para mim durante o teste de unidade.

Eu também encontrei um problema semelhante, siga estes passos para resolver:

  1. O pai é NSManagedObject, não NSObject
  2. O módulo de uma entidade é padrão, não “Módulo do produto atual”

O que funcionou para mim (Xcode 7.4, Swift) está mudando o nome da class para . no Inspetor de entidade, na checkbox ‘Class’.

Meu iniciador da subclass Objeto gerenciado, se parece com isto:

  convenience init() { let entityDescr = NSEntityDescription.entityForName("", inManagedObjectContext: ) self.init(entity: entityDescr!, insertIntoManagedObjectContext: )} //init properties here