Embora o Interface Builder esteja ciente de um MyClass
erro, eu recebo um erro ao iniciar o aplicativo.
Isso acontece quando MyClass
faz parte de uma biblioteca e não acontece se eu compilar a classe diretamente no destino do aplicativo.
Embora o Interface Builder esteja ciente de um MyClass
erro, eu recebo um erro ao iniciar o aplicativo.
Isso acontece quando MyClass
faz parte de uma biblioteca e não acontece se eu compilar a classe diretamente no destino do aplicativo.
Respostas:
Apesar do erro " Classe desconhecida MyClass no arquivo Interface Builder. " Impresso em tempo de execução, esse problema não tem nada a ver com o Interface Builder, mas com o vinculador, que não está vinculando uma classe porque nenhum código a usa diretamente.
Quando os dados .nib (compilados a partir do .xib) são carregados em tempo de execução, MyClass
são referenciados usando uma string, mas o vinculador não analisa a funcionalidade do código, apenas a existência do código, portanto, não sabe disso. Como nenhum outro arquivo de origem faz referência a essa classe, o vinculador a otimiza para não existir ao tornar o executável. Portanto, quando o código da Apple tenta carregar essa classe, ele não consegue encontrar o código associado a ela e imprime o aviso.
Por padrão, os destinos de Objective-C terão -all_load -ObjC
sinalizadores definidos por padrão, que manterão todos os símbolos. Mas eu tinha começado com um destino C ++ e não tinha isso. No entanto, encontrei uma maneira de contornar isso, que mantém o vinculador 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, 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ão precisamos realmente adicionar um _keepAtLinkTime
método. Simplesmente chamando um existente, como:
[MyClass class];
faz o truque (contanto que você deriva de um NSObject
).
Obviamente, você pode chamar isso em qualquer local do seu código. Eu acho que pode até estar em código inacessível. A idéia é enganar o vinculador a pensar que MyClass
é usado em algum lugar para que não seja tão agressivo na otimização.
Rápida definição de visão. Certifique-se de substituir init(coder aDecoder: NSCoder)
. Objective-C definição de controlador de exibição. E uma ponta em uma pereira.
Adicione o nome do módulo ao inspetor de detalhes da ponta onde você escolhe sua classe.
MyClass
. Basta chamar um método do qual herda NSObject
, como +class
.
MyClass.m
na seção Associação ao Destino do Inspetor de Arquivos.
Corrigi isso de acordo com o que Laura sugeriu, mas não precisei recriar os arquivos.
Usando o XCode 4, no Project Navigator , selecione o arquivo .m que contém a classe da qual está reclamando
Vá em Exibir-> Utilitários-> Mostrar Inspetor de Arquivos
(isso mostrará o Inspetor de Arquivos à direita, com as informações do arquivo .m)
Abra a seção Associação ao destino e verifique se o seu destino está selecionado para este arquivo .m
Quando adicionei meu arquivo .m ao meu projeto, ele não foi adicionado ao meu destino padrão por algum motivo e isso causou 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 da sua biblioteca estática pelo Xcode. Para resolver esse problema, você precisa adicionar os -all_load -ObjC
sinalizadores à Other Linker Flags
chave das configurações de compilação do projeto (e possivelmente do destino).
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 forçar a inclusão de todos os nossos objetos da nossa biblioteca estática adicionando o -all_load
sinalizador do vinculador. Se você pular esses sinalizadores mais cedo ou mais tarde, você encontrará o erro unrecognized selector
ou obterá outras exceções, como a que você observou aqui.
-ObjC
bandeira o consertava no meu caso.
-ObjC
é bom o suficiente para corrigir o problema.
Encontrei esse problema hoje usando o Swift.
Eu mudei uma classe Model.h + Model.m
para a Model.swift
. Este objeto foi usado no Interface Builder com o class = Model
.
Assim que substituí o objeto, a classe não pode mais ser carregada.
O que eu tive que fazer foi mudar a referência de classe no IB de:
Class = Model
Module =
para
Class = Model
Module = <TARGETNAME>
Você encontrará as <TARGETNAME>
configurações de compilação. É também o nome que aparece no seu Swift-Header gerado:#import "TARGETNAME-Swift.h"
Module
nome estava ali no menu suspenso. Era o nome do meu aplicativo.
Vá para o "ProjectName", clique nele e, em seguida, vá na guia "Fases de construção" e, em seguida, clique em "compilar fontes" e, em seguida, clique no botão "+", uma janela aparecerá e escolha "MyClass". m "e clique em" adicionar ",
Construa o projeto e execute-o, o problema certamente será resolvido
É um problema de cache do Xcode4, basta excluir todas as pastas em / Usuários / seu_usuário / Biblioteca / Suporte a aplicativos / iPhone Simulator / 4.3 / Aplicativos /
Além disso, se você tiver o mesmo problema de teste 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:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">
para isso:
<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
customModule="MyFrameworkName"
. +10
Meu caso - Ao tentar usar uma classe de uma estrutura rápida no meu projeto de objetivo c, recebi esse erro. A solução foi adicionar o módulo (estrutura rápida) da classe no Interface builder / Storyboard, como mostrado abaixo. Nada mais
Vá para Build Phases-> Compile Sources e adicione seus novos arquivos .m.
No meu caso, estava mostrando um erro para uma classe que nem existia! Eu suspeitava que isso fosse algo que foi divulgado no arquivo do storyboard. Se você não reconhecer o arquivo de classe no erro, tente o seguinte:
1) abra seu projeto em sublime ou outro bom editor. Procure a classe a que se refere. 2) remova a parte inteira que diz
customClass="UnrecognizedClassName"
3) salve-o. 4) retorne ao xcode e limpe o projeto e tente executá-lo agora.
trabalhou para mim.
customClass="MyCla"
). Em vez de excluir a tarefa de classe personalizada, era prudente eu simplesmente colocar a classe que pretendia usar em primeiro lugar :) #
Eu só quero adicionar esta resposta, já que a maioria, se não todas as respostas aqui, assumem que a classe realmente existe .. é apenas que o vinculador / compilador é burro demais para vê-lo .. assim as respostas giram em torno de alertar o vinculador para a existência da classe ou criando um hack para 'forçar' existe.
meu problema acontece quando esta mensagem está realmente falando de uma classe inexistente. Portanto, um exemplo seria eu voltando a uma revisão antiga do git que não tem conhecimento de uma determinada classe. No entanto, o compilador reclama que a referida classe não ' não existe ..
solução?
você deve estar pronto para ir depois disso
A melhor maneira de remover o erro é: 1) Selecione o arquivo de classe (.m) 2) Em " Associação de destino ", "marque" a entrada de nome do projeto
Corrigi isso copiando o texto das minhas classes.h e .m, excluindo esses arquivos de classe do projeto e criando novos arquivos de classe.h e .m com o mesmo nome usando "Adicionar arquivo". Depois colei o código novamente 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.
Eu finalmente consertei isso, esqueci de adicionar o seguinte código ao meu arquivo .m:
@implementation MyTableViewCell
@end
Portanto, isso estava sendo causado porque eu criei um espaço reservado @interface para a célula da minha tabela, que tinha uma conexão com um elemento no arquivo .xib, mas há um erro no Interface Builder em que, se nenhuma implementação for especificada para uma classe, não pode encontrá-lo.
Eu havia passado por todas as etapas de outros fóruns, visualizando o .xib como fonte e vendo o MyTableViewCell, apesar de ter comentado isso fora do meu código. Eu tentei redefinir o simulador. Eu até tentei dividir todas as minhas classes em arquivos separados com o mesmo nome das interfaces, mas nada funcionou até isso.
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 um @interface e eles funcionam bem.
PPS Tenho uma explicação mais detalhada sobre por que UITableViewCell e UICollectionViewCell causam esse erro em https://stackoverflow.com/a/22797318/539149, juntamente com como revelá-lo em tempo de compilação usando registerClass: forCellWithReuseIdentifier :.
Isso acontece porque o .xib possui um link obsoleto para o antigo App Delegate, que não existe mais. Corrigi assim:
Eu tentei essas e outras respostas listadas neste site, nenhuma das quais classificou para mim. Esses comentários (em 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 do mouse neles e escolhendo 'visualizar como código fonte'. Então, procurando por ele surgiu
<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 a última linha não o corrige infelizmente, reclamando que há um número errado de itens no arquivo. Você precisa remover a linha correspondente na seção de linhas acima, à qual se refere CustomClass
.
No meu caso, eu tenho o XCode6, o arquivo .m da classe especificado acaba no local errado na fase de construção - deveria estar em Fontes de Compilação , mas no arquivo
Não apenas nas configurações do projeto, mas na configuração do destino, você também deve adicionar sinalizadores -all_load -ObjC.
Core-Plot: Classe desconhecida CPLayerHostingView no arquivo do Interface Builder
Esse problema parece não estar desatualizado.
Eu tive o mesmo problema com o Xcode 8 e resolvi-o de forma semelhante ao smilebot :
Abra seu arquivo de storyboard como "Código-fonte" no Xcode:
Pesquise a classe a que se refere e remova a parte inteira que diz
customClass = "UnrecognizedClassName"
Eu tinha 'Classe desconhecida favouritesButton no arquivo Interface Builder' e o localizei em uma cena de livro de histórias em que o botão em questão tinha uma classe personalizada falsa de "favouritesButton" no campo Classe na parte superior do Identity Inspector. Eu pretendia colocar esse valor no próximo campo: Identity Label.
Alterar isso para "UIButton" resolveu o problema.
Eu me deparei com isso em Swift.
Mover o arquivo .xib para a pasta Base.lproj do projeto se livrou desse erro.
Hoje, ocorreu esse erro ao converter meu aplicativo aaLuminate para Universal no Xcode 4. Esse aplicativo é baseado no modelo de utilitário e foi originalmente construído no Xcode 3.
Para economizar tempo, copiei as Visualizações principal e Flipside do iPhone para nomes apropriados no aplicativo Universal. Eu experimentei o erro "Classe desconhecida x no arquivo do Interface Builder". No meu caso, não havia nada nos arquivos ou destinos XIB.
Também copiei o arquivo aaLuminate-Info.plist por outros motivos - isso tinha uma chave antiga "Nome principal da base do arquivo da ponta" definida como MainWindow.
Assim que eu apaguei essa chave, ela corrigiu o problema!
No meu caso, recebi esse erro porque havia tentado salvar algum trabalho criando um novo projeto e, em seguida, excluindo vários arquivos de origem e copiando os arquivos de origem com o mesmo nome do projeto em funcionamento. Também copiei meu arquivo MainStoryBoard, que estava procurando meu RootViewController. No entanto, quando excluí o RootViewController original e o adicionei no RootViewController do produto anterior, evidentemente a operação Adicionar Arquivos falhou ao "marcar" a caixa de destino, conforme sugerido acima. Ao visitar todos os arquivos ".m" importados da newley e verificar se a caixa de associação de destino estava marcada, tudo estava bem. Acho que o que estava acontecendo era que o arquivo do storyboard procurava uma classe que havia sido "excluída" do link porque a associação de destino estava desmarcada. Assegurar que os arquivos necessários para o destino sejam designados na associação de destino no inspetor de arquivos. Obrigado Pat! (Veja acima)
No meu caso, foi porque eu declarei uma subclasse de uma subclasse de uma célula UITableView no arquivo .h (a declaração de ambas as subclasses estava no mesmo arquivo .h), mas esqueci de fazer uma implementação vazia dessa segunda subclasse no arquivo .m.
não se esqueça de implementar qualquer subclasse de uma subclasse que você declara no arquivo .h! Parece simples, mas fácil de esquecer, porque o Xcode fará isso por você se você estiver trabalhando com uma classe por arquivo .h / .m.
Eu tinha "Classe desconhecida RateView no Interface Builder", em que RateView era uma subclasse do UIView. Eu soltei um UIView na minha cena do Storyboard e alterei o campo Classe personalizada para RateView. Ainda assim, esse erro apareceu.
Para depurar, alterei o nome da minha classe para RateView2 e alterei todas as referências para corresponder, exceto o campo Classe personalizada do UIView. A mensagem de erro ainda apareceu como antes com o RateView como a classe ausente. Isso confirmou que a mensagem de erro estava relacionada ao valor do campo Classe personalizada. Alterei esse valor para RateView2 e a mensagem de erro foi alterada para "Classe desconhecida RateView2 no Interface Builder". Progresso das sortes.
Por fim, inspecionei os arquivos do código-fonte no Inspetor de Arquivos. Lá, descobri que o arquivo de código-fonte (copiado de um tutorial) não estava associado ao meu Target. Em outras palavras, não possuía associação de destino. Marquei a caixa que fazia do arquivo de código-fonte da classe um membro do aplicativo de destino e a mensagem de erro desapareceu.
No meu caso, excluí uma classe chamada "viewController" sem perceber que ela foi selecionada com o inspetor de identidade do storyboard (em 'Classe personalizada' na parte superior).
Você apenas precisa selecionar a classe correta para o controlador de exibição no campo Classe personalizada do seu inspetor de identidade ou adicionar uma nova classe ao seu projeto e selecionar essa como sua Classe personalizada.
Trabalhou para mim!
Adicionei o arquivo Em fase de construção no Targets e o problema foi resolvido. Para as etapas para adicionar o arquivo, veja minha resposta em:
Isso me deixou louco 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 apenas o excluí e o adicionei novamente com a mesma classe especificada. Erro desapareceu ...