Estou trabalhando no desenvolvimento de um aplicativo com o Core Data. Quando criei uma instância usando:
let entity = NSEntityDescription.entityForName("User", inManagedObjectContext: appDelegate.managedObjectContext)
let user = User(entity: entity, insertIntoManagedObjectContext: appDelegate.managedObjectContext)
Recebi um aviso no log:
CoreData: warning: Unable to load class named 'User' for entity 'User'. Class not found, using default NSManagedObject instead.
Como eu poderia consertar isso?
E outra pergunta, como posso definir um método de instância na subclasse NSManagedObject?
Editar:
Especifiquei a classe da entidade como na captura de tela a seguir:
ios
core-data
swift
nsmanagedobject
MsrButterfly
fonte
fonte
Respostas:
Atualização para o Xcode 7 (final): A adição do nome do módulo à classe (como no Xcode 6 e nas versões beta anteriores do Xcode 7) não é mais necessária. A documentação da Apple Implementando subclasses de objeto gerenciado por dados principais foi atualizada de acordo.
O inspetor de modelo de dados agora possui dois campos "Classe" e "Módulo" para uma entidade:
Quando você cria uma subclasse de objeto gerenciado Swift para a entidade, o campo "Módulo" é definido como "Módulo atual do produto" e, com essa configuração, a criação de instâncias funciona tanto no aplicativo principal quanto nos testes de unidade. A subclasse de objeto gerenciado não deve ser marcada com
@objc(classname)
(isso foi observado em https://stackoverflow.com/a/31288029/1187415 ).Como alternativa, você pode esvaziar o campo "Módulo" (ele mostrará "Nenhum") e marcar as subclasses de objetos gerenciados com
@objc(classname)
(isso foi observado em https://stackoverflow.com/a/31287260/1187415 ).Observação: Esta resposta foi originalmente escrita para o Xcode 6. Houve algumas alterações nas várias versões beta do Xcode 7 com relação a esse problema. Como é uma resposta aceita com muitos upvotes e links para ela, tentei resumir a situação da atual versão final do Xcode 7.
Eu fiz minha própria "pesquisa" e li todas as respostas para essa pergunta e para a pergunta semelhante CoreData: warning: Não é possível carregar a classe nomeada . Portanto, a atribuição é atribuída a todos eles, mesmo que eu não os liste especificamente!
Resposta anterior para o Xcode 6 :
Conforme documentado em Implementando subclasses de objeto gerenciado por dados principais , você deve prefixar o nome da classe de entidades no campo Classe no inspetor de entidades do modelo com o nome do seu módulo, por exemplo "MyFirstSwiftApp.User".
fonte
@objc(ClassName)
método sugerido na resposta de Christer.Apenas como uma nota lateral. Eu tive o mesmo problema. E tudo que eu tinha que fazer era adicionar
@objc(ClassName)
no meu arquivo de classe.Exemplo:
E isso resolveu meu problema.
fonte
A resposta aceita para essa pergunta me ajudou a resolver o mesmo problema, mas eu tinha uma ressalva que achava que seria útil para outras pessoas. Se o nome do seu projeto (módulo) tiver um espaço, você deverá substituir o espaço por um sublinhado. Por exemplo:
Entidade: MyEntity Classe: My_App_Name.MyClass
fonte
Lembre-se de remover seu módulo :
fonte
Dependendo se você estiver executando como App vs Tests, o problema pode ser que o aplicativo está procurando
<appName>.<entityName>
e quando está sendo executado como teste<appName>Tests.<entityName>
. A solução que eu uso no momento (Xcode 6.1) é NÃO preencher oClass
campo na interface do usuário CoreData e fazê-lo no código.Esse código detectará se você está executando como App vs Tests e usa o nome correto do módulo e atualiza o
managedObjectClassName
.fonte
Se você estiver usando um hífen no nome do seu projeto como "My-App", use um sublinhado em vez do hífen como "My_App.MyManagedObject". Em geral, observe o nome do arquivo xcdatamodeld e use o mesmo prefixo daquele nome. Ou seja, "My_App_1.xcdatamodeld" requer o prefixo "My_App_1"
fonte
Isso pode ajudar aqueles com o mesmo problema. Eu estava, com Swift 2 e Xcode 7 beta 2.
A solução no meu caso era para comentar
@objc(EntityName)
noEntityName.swift
.fonte
Eu tive o mesmo aviso, embora meu aplicativo parecesse funcionar bem. O problema era que, ao executar Editor> Criar subclasse NSManagedObject na última tela, usei o local padrão do grupo, sem destinos exibidos ou verificados, que salvou a subclasse no diretório MyApp superior, onde MyApp.xcodeproj estava localizado.
O aviso desapareceu quando, em vez disso, mudei o Grupo para a subpasta MyApp e verifiquei o destino MyApp.
fonte
As respostas acima foram úteis. Essa verificação rápida de sanidade pode poupar algum tempo. Vá para Projeto> Fases de construção> Compilar fontes e remova o xcdatamodeld e os arquivos de modelo com o botão "-" e adicione-os novamente com o botão "+". Reconstruir - isso pode cuidar disso.
fonte
A propósito, tenha cuidado com o que você adiciona como prefixo: Meu aplicativo é chamado "ABC-def" e o Xcode converteu o "-" em um "_".
Para estar seguro, procure o localizador, encontre os arquivos do projeto e veja o que diz para o seu modelo de dados (por exemplo "ABC_def.xcdatamodeld") e use o que está escrito EXATAMENTE !!!
fonte
As respostas acima me ajudaram a resolver problemas diferentes relacionados ao Objective-C (talvez isso ajude alguém):
Se você refatorou os nomes das entidades, não se esqueça de alterar "Classe" no "Painel de Utilitários" também.
fonte
As respostas acima me ajudaram, mas isso pode ajudar alguém. Se, como eu, você os fez e ainda está tendo um problema, lembre-se de simplesmente 'limpar seu projeto'. Para o XCode8, Produto> Limpar. Então corra novamente.
fonte
No Xcode 7, os nomes de entidade e classe podem ser os mesmos, mas Codegen deve ser Definição de classe. Nesse caso, não haverá aviso, etc. insira a descrição da imagem aqui
fonte