Erro “Classe desconhecida no arquivo do Construtor de Interface” no tempo de execução

Embora o Interface Builder esteja ciente de um MyClass , recebo um erro ao iniciar o aplicativo.

Isso acontece quando o MyClass é parte de uma biblioteca e não acontece se eu compilar a class diretamente no destino do aplicativo.

Apesar do erro ” Unknown class MyClass in Interface Builder file “, impresso em tempo de execução, esse problema não tem nada a ver com o Interface Builder, mas sim com o linker, que não está vinculando uma class porque nenhum código a usa diretamente.

Quando os dados .nib (compilados do .xib) são carregados no tempo de execução, o MyClass é referenciado usando uma string, mas o linker não analisa a funcionalidade do código, apenas codifica a existência, portanto, não sabe disso. Como nenhum outro arquivo de origem faz referência a essa class, o vinculador otimiza a existência ao criar o executável. Então, quando o código da Apple tenta carregar uma class, ela não consegue encontrar o código associado a ela e imprime o aviso.

Por padrão, os destinos Objective-C terão os sinalizadores -all_load -ObjC definidos por padrão, que manterão todos os símbolos. Mas eu comecei com um alvo C ++ e não tive isso. No entanto, encontrei uma maneira de contornar isso, o que mantém o linker agressivo.

O hack que eu estava usando originalmente era adicionar uma rotina estática vazia como:

 +(void)_keepAtLinkTime; 

que não faz nada, mas que eu chamaria uma vez, tais como:

 int main( int argc, char** argv ) { [MyClass _keepAtLinkTime]; // Your code. } 

Isso forçaria o vinculador a manter toda a class e o erro desaparecerá.

Como jlstrecker apontou nos comentários, nós realmente não precisamos adicionar um método _keepAtLinkTime . Basta ligar para um existente, como:

  [MyClass class]; 

faz o truque (contanto que você derive de um NSObject ).

Claro, você pode chamar isso em qualquer local do seu código. Eu acho que poderia até estar em código inacessível. A idéia é enganar o linker para pensar que o MyClass é usado em algum lugar para que não seja tão agressivo ao otimizá-lo.

Xcode 6.3.2 e Swift 1.2

Definição rápida de visão. Certifique-se de replace o init(coder aDecoder: NSCoder) . Definição objetiva-C do controlador de visualização. E um bico em uma tree de pêra.

Adicione o nome do módulo ao inspetor de detalhes da ponta onde você escolhe sua class.

Eu fixei isso nas linhas do que Laura sugeriu, mas eu não precisei recriar os arquivos.

  • Usando o XCode 4, no Project Navigator , selecione o arquivo .m que contém a class da qual ele está reclamando.

  • Vá para View-> Utilities-> Show File Inspector
    (isso mostrará o Inspetor de Arquivos à direita, com essa informação de arquivo -m)

  • Abra a seção Target Membership e certifique-se de que seu destino esteja selecionado para este arquivo .m

Quando adicionei meu arquivo .m ao meu projeto, ele não o adicionou ao meu destino padrão por algum motivo e isso me levou a obter o erro que você mencionou.

Isso realmente não tem nada a ver com o Interface Builder, o que está acontecendo aqui é que os símbolos não estão sendo carregados de sua biblioteca estática pelo Xcode. Para resolver esse problema, você deve adicionar os sinalizadores -all_load -ObjC à chave Other Linker Flags o Project (e possivelmente o Target) Build Settings.

Como o Objective-C gera apenas um símbolo por class, devemos forçar o vinculador a carregar os membros da class também usando o sinalizador -ObjC, e também devemos forçar a inclusão de todos os nossos objects de nossa biblioteca estática adicionando o -all_load bandeira. Se você ignorar essas bandeiras mais cedo ou mais tarde, você encontrará o erro do unrecognized selector ou obterá outras exceções, como a que você observou aqui.

Eu me deparei com esse problema hoje usando o Swift.

Eu mudei uma class Model.h + Model.m para um Model.swift . Este object foi usado no Interface Builder com o class = Model .

Assim que substitui o object, a class não pode mais ser carregada.

O que eu tive que fazer foi mudar a referência de class no IB de:

 Class = Model Module = 

para

 Class = Model Module =  

Você encontrará o nas configurações de compilation. Também é o nome que aparece no seu Swift-Header gerado: #import "TARGETNAME-Swift.h"

Vá para o “ProjectName”, clique nele, e então vá na aba “Construir fases”, e então clique em “compile sources”, e então clique no botão “+”, uma janela irá aparecer, a escolha “MyClass. m “arquivo e clique em” adicionar “,

Construir o projeto e executá-lo, o problema certamente será resolvido

É um problema de cache do Xcode4, apenas exclua todas as pastas em / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

Além disso, se você tiver o mesmo problema no seu iPhone, exclua o aplicativo antigo antes de executá-lo …

Boa sorte. Pascual

Às vezes, o IBuilder perdia customModule="AppName" customModuleProvider="target"

Para corrigi-lo, abra o storyboard como código-fonte e substitua esta linha:

  

para isso:

  

Vá para Build Phases-> Compile Sources e adicione seus novos arquivos .m.

No meu caso, estava mostrando um erro para uma aula que nem existia! Eu suspeitava que era algo que foi criado no arquivo do storyboard. Se você não reconhecer o arquivo de class no erro, tente isto:

1) abra seu projeto em sublime ou outro bom editor. Procure a class que está sendo referida. 2) remover todo o bit que diz

 customClass="UnrecognizedClassName" 

3) salve. 4) retorne ao xcode e limpe o projeto, e tente executá-lo agora.

trabalhou para mim.

insira a descrição da imagem aqui

Meu caso – Tentando usar uma class de uma estrutura rápida no meu projeto c objective, eu tenho esse erro. A solução foi adicionar o módulo (estrutura rápida) da class no construtor de interface / storyboard como mostrado abaixo. Nada mais

insira a descrição da imagem aqui

Eu só quero adicionar essa resposta, já que a maioria, se não todas as respostas aqui, presume que a class realmente existe .. é só que o linker / compilador é muito burro para ver .. assim as respostas giram em torno de alertar o linker para a existência da class ou criando um hack para “forçar” existe ..

meu problema acontece quando esta mensagem está realmente falando sobre uma class inexistente .. então, um exemplo seria eu revertendo para uma revisão git antiga que não tem conhecimento de uma certa class .. ainda assim o compilador reclama que a dita class não existe ..

solução?

  • Nuke a coisa toda! primeiro exclua todos os arquivos de compilation, excluindo todo o conteúdo deste diretório ~ / Library / Developer / Xcode / DerivedData
  • excluir o aplicativo do próprio telefone (e limpar o conteúdo do simulador se você estiver usando um simulador)

você deve ser bom para ir depois disso

A melhor maneira de remover o erro é: 1) Selecione o arquivo de class (.m) 2) Em ” Associação de destino “, “verifique” a input do nome do projeto

Eu consertei isso copiando o texto da minha class.heim, excluindo esses arquivos de class do projeto e criando novos arquivos class.h e .m com o mesmo nome usando “Add File”. Depois colei o código de volta nos novos arquivos e tudo funcionou muito bem. De alguma forma, os arquivos não foram vinculados corretamente quando foram criados. Não precisei usar nenhum sinalizador de vinculador depois disso.

Isso acontece porque o .xib tem um link obsoleto para o antigo Delegado de aplicativos, que não existe mais. Eu consertei assim:

  • Clique com o botão direito do mouse no .xib e selecione Abrir como> Código-fonte
  • Nesse arquivo, pesquise o delegado antigo do App e substitua-o pelo novo

basta adicionar abaixo o código no início do método appdelegate applicatoindidfinishlanching, então ele funcionará bem

[class myclass];

Eu finalmente resolvi isso, eu tinha esquecido de adicionar o seguinte código ao meu arquivo .m:

 @implementation MyTableViewCell @end 

Então, isso estava sendo causado porque eu tinha feito um placeholder @interface para minha célula da tabela, que tinha uma conexão com um elemento no arquivo .xib, mas há um bug no Interface Builder, onde se @implementation não for especificado para uma class, não pode encontrá-lo.

Eu tinha passado por todos os passos de outros fóruns de visualização do .xib como fonte e vendo MyTableViewCell, embora eu tivesse comentado fora do meu código. Eu tentei reiniciar o simulador. Eu até tentei dividir todas as minhas aulas em arquivos separados com o mesmo nome das interfaces, mas nada funcionou até que isso acontecesse.

PS na minha experiência, não importa se os nomes dos arquivos .h / .m são diferentes dos nomes da @interface. Eu tenho vários arquivos contendo mais de uma @interface e eles funcionam bem.

PPS Eu tenho uma explicação mais detalhada do porquê UITableViewCell e UICollectionViewCell causar esse erro em https://stackoverflow.com/a/22797318/539149 juntamente com como revelá-lo em tempo de compilation usando registerClass: forCellWithReuseIdentifier :.

Eu tentei isso e outras respostas listadas neste site, nenhuma das quais o classificou para mim. Esses comentários (de http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) ajudaram:

Depois de pesquisar, pesquisar e pesquisar, finalmente descobri o nome dessa class excluída oculta em um arquivo. Eu tive que abrir os arquivos do construtor de interface no código X, clicando com o botão direito e escolhendo ‘view as source code’. Então, procurando por ele veio com

  YES com.apple.InterfaceBuilder.IBCocoaTouchP lu gin *this was the class name* 

Simplesmente remover essa última linha não corrige, infelizmente, reclamando que há o número errado de itens no arquivo. Você precisa remover a linha correspondente na seção de linhas acima dela, que se refere ao CustomClass .

No meu caso, eu tenho XCode6, o arquivo .m class especificado acabar no lugar errado na fase de compilation – Ele deveria ter sido em fonts de compilation , mas acabar no Copiar recursos do pacote

Esse problema não parece ficar desatualizado.

Eu tive o mesmo problema com o Xcode 8 e resolvi-o parecido com o smilebot :

  1. Abra seu arquivo de storyboard como “Código-fonte” no Xcode:

  2. Pesquise a class que está sendo consultada e remova o bit inteiro que diz

customClass = “UnrecognizedClassName”

  1. Abra seu arquivo de storyboard como “interfacebuilder – storyboard” novamente e reconstrua seu aplicativo.

Não só nas configurações do projeto, mas na configuração Target também vc tem que adicionar -all_load -ObjC flags ..

Core-Plot: Classe desconhecida CPLayerHostingView no arquivo do Interface Builder

Basta remover o MyClass.m e .h e adicioná-los ao projeto novamente é trabalho para mim.

Eu tinha ‘Unknown class favouritesButton no arquivo Interface Builder’ e segui-lo para uma cena de contos de fadas onde o botão em questão tinha uma class personalizada de “favouritesButton” no campo Class no topo do Identity Inspector. Eu quis colocar esse valor no próximo campo: Identity Label.

Mudar isso para “UIButton” resolveu o problema.

Eu corri para isso em Swift.

Mover o arquivo .xib para a pasta Base.lproj do projeto se livrou desse erro.

Eu tive esse erro aparecendo hoje ao converter meu aplicativo aaLuminate para Universal no Xcode 4. Esse aplicativo é baseado no modelo de utilitário e foi originalmente criado no Xcode 3.

Para economizar tempo, copiei o iPhone Main e o Flipside Views para nomes apropriados no aplicativo Universal. Eu experimentei o erro “Unknown class x in Interface Builder file”. No meu caso, não era nada nos arquivos ou destinos XIB.

Eu também copiei o arquivo aaLuminate-Info.plist por outras razões – isso tinha uma chave antiga “Nome base do arquivo de nib principal” definido como MainWindow.

Assim que eu deletei esta chave, resolvi o problema!

No meu caso, recebi este erro porque tentei salvar algum trabalho criando um novo projeto e, em seguida, excluindo vários dos arquivos de origem e copiando os arquivos de origem com o mesmo nome do projeto de trabalho. Eu também copiei meu arquivo MainStoryBoard que estava procurando pelo meu RootViewController. No entanto, quando eu tinha excluído o RootViewController original e, em seguida, adicionado no RootViewController do produto anterior, evidentemente a operação Adicionar arquivos não pôde “verificar” a checkbox de destino como sugerido acima. Por apenas visitar todos os arquivos “.m” importados do newley e certificar-se de que a checkbox de associação de destino estava marcada, tudo estava bem. Acho que o que estava acontecendo era que o arquivo do storyboard estava procurando por uma class que havia sido “excluída” do link porque a associação de destino estava desmarcada. Certificar-se de que os arquivos necessários para o destino sejam assim designados na associação de destino no inspetor de arquivos fez o truque. Obrigado Pat! (Veja acima)

No meu caso, foi porque declarei uma subclass de uma subclass de uma célula UITableView no arquivo .h (a declaração de ambas as subclasss estava no mesmo arquivo .h), mas esqueci de fazer uma implementação vazia dessa segunda subclass no arquivo .h. arquivo .m.

não esqueça de implementar qualquer subclass de uma subclass que você declarar no arquivo .h! Parece simples, mas fácil de esquecer porque o Xcode fará isso para você se você estiver trabalhando com uma class por arquivo .h / .m.

Eu tinha “Unknown RateView no Interface Builder” onde RateView era uma subclass do UIView. Eu deixei cair uma UIView na cena do Storyboard e mudei o campo Custom class para RateView. Ainda assim, esse erro apareceu.

Para depurar, alterei o nome da minha class para RateView2 e alterei todas as referências para correspondência, exceto o campo Custom class do UIView. A mensagem de erro ainda aparecia como antes com o RateView como a class ausente. Isso confirmou que a mensagem de erro estava relacionada ao valor do campo Classe personalizada. Eu mudei este valor para RateView2 e a mensagem de erro foi alterada para “Unknown RateView2 no Interface Builder”. Progresso das sortes.

Finalmente, inspecionei os arquivos de código-fonte no Inspetor de arquivos. Lá, descobri que o arquivo de código-fonte (que eu havia copiado de um tutorial) não estava associado ao meu Target. Em outras palavras, não tinha nenhum membro alvo. Eu verifiquei a checkbox que fez do arquivo de código-fonte da class um membro do aplicativo de destino e a mensagem de erro foi embora.

No meu caso, eu havia deletado uma class chamada “viewController”, não percebendo que ela foi selecionada com o inspetor de identidade do storyboard (sob ‘Custom Class’ no topo).

Basta selecionar a class correta para o controlador de exibição no campo Classe Personalizada do seu inspetor de identidade ou adicionar uma nova class ao seu projeto e selecioná-la como Classe Personalizada.

Trabalhou para mim!

Eu adicionei o arquivo em fase de compilation nos destinos e o problema foi resolvido. Para as etapas para adicionar o arquivo, veja minha resposta em:

Erro do Apple Mach-O Linker (APActivityIcon)

Isso me deixou louca por um tempo e nenhuma das sugestões acima me ajudou a me livrar do erro. Felizmente, eu só tive um object IB usando a class, então eu simplesmente deletei e adicionei de volta com a mesma class especificada. Erro foi embora …