cocoa - what - xcode filemerge




Erro de "Classe desconhecida<MyClass> no arquivo do Construtor de Interface" no tempo de execução (20)

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

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

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

para isso:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

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 classe diretamente no destino do aplicativo.


É 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


Apesar do erro " Classe desconhecida MyClass in Interface Builder. " Erro impresso em tempo de execução, esse problema não tem nada a ver com o Interface Builder, mas sim com o vinculador, que não está vinculando uma classe 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 vinculador 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 classe, o vinculador otimiza a existência ao criar o executável. Assim, quando o código da Apple tenta carregar uma classe, 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 classe 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 criador de links 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 substituir o init(coder aDecoder: NSCoder) . Definição objetiva-C do controlador de visualização. E um bico numa pereira.

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


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



Eu consertei isso copiando o texto da minha classe.heim, excluindo esses arquivos de classe 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. Eu não precisei usar nenhum sinalizador de vinculador depois disso.


Eu finalmente consertar 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 de 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 classe, não pode encontrá-lo.

Eu tinha percorrido 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://.com/a/22797318/539149 juntamente com como revelá-lo em tempo de compilação usando registerClass: forCellWithReuseIdentifier :.


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 classe da qual ele está reclamando.

  • Vá para View-> Utilities-> Show File Inspector
    (isto mostrará o Inspetor de Arquivos à direita, com aquela informação .m-file)

  • 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.


Eu só quero adicionar essa resposta, já que a maioria, se não todas as respostas aqui, supõe que a classe realmente existe .. é só que o linker / compilador é burro demais para vê-lo .. assim as respostas giram em torno de alertar o linker para a existência da classe ou criando um hack para "forçar" existe ..

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

solução?

  • Nuke a coisa toda! primeiro exclua todos os arquivos de compilação, 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


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

Depois de pesquisar e pesquisar e pesquisar, finalmente descobri o nome dessa classe 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

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

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 .


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 classe 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 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 "Desconhecido classe x no arquivo do Construtor de Interface". 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 principal do nib" definido como MainWindow.

Assim que eu deletei esta chave, resolvi o problema!


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


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 classe, devemos forçar o vinculador a carregar os membros da classe também usando o sinalizador -ObjC e também devemos forçar a inclusão de todos os nossos objetos de nossa biblioteca estática, adicionando o vinculador -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.



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

1) abra seu projeto em sublime ou outro bom editor. Procure a classe 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.


No meu caso, eu tenho XCode6, o arquivo .m classe especificado acabar no lugar errado na fase de compilação - Ele deveria ter sido em fontes de compilação , mas acabar no


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

não esqueça de implementar qualquer subclasse de uma subclasse 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 classe por arquivo .h / .m.


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


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





interface-builder