Bug do Xcode 6: classe desconhecida no arquivo do Interface Builder

600

Atualizei para o Xcode 6 beta 4 e agora meu aplicativo trava continuamente com a mensagem

Classe X desconhecida no arquivo do Interface Builder.

Falha porque supostamente o Xcode não consegue encontrar minhas classes personalizadas que vinculei no meu Storyboard, mas mostra que elas estão vinculadas corretamente na interface do Xcode.

Estou certo de que tudo está vinculado corretamente. Minha única outra opção pode ser excluir o arquivo de storyboard inteiro e começar do zero, pois pode estar corrompido de alguma forma.

Edit: Eu também gostaria de acrescentar que tentei limpar, redefinir o simulador, mexer nas fases de construção etc. Nada disso funciona.

Byte épico
fonte
Possível duplicada de stackoverflow.com/questions/3416269/…
Bouke
1
@ ImreKelényi Você está certo. Isso aconteceu comigo novamente recentemente, depois de fazer o que você acabou de descrever.
Byte épico
Isso funcionou para mim, stackoverflow.com/questions/1725881/...
vrunoa
Foi um erro de digitação para mim, depure-o no elemento Control, até que, quando vier, selecione; Exibir Controlador> inspetor de identidade> Classe Personalizada> Classe. exclua isso se essa classe não estiver definida.
mavericks
9
OBSERVE! Este "erro" pode resultar de diferentes origens. Se a resposta aceita não funcionar para você, desça e tente a próxima resposta. A resposta correta para minha situação foi a quinta resposta.
22416 Jacksonkr

Respostas:

1454

Resolvi esse problema enquanto digitava a pergunta. Imaginei que responderia à minha pergunta e deixaria aqui para qualquer pessoa que possa enfrentar esse problema ao usar o Xcode 6 beta 4.

Para resolver esse problema, você precisa selecionar cada um dos seus objetos de classe personalizados no Storyboard (isso inclui qualquer exibição personalizada, até os próprios controladores de exibição personalizados).

Em seguida, com esses objetos selecionados, abra o inspetor de identidade e, em "Classe personalizada", você deverá ver a opção Módulo. Clique dentro da caixa de texto Módulo e pressione Enter.

É isso aí! O módulo atual de todos os meus objetos personalizados deve ter sido definido internamente incorretamente de alguma forma no Xcode 6 beta 4. Mas não havia indicação visual disso no inspetor.

Observe que, se pressionar Enter dentro da caixa de texto Módulo não funcionar, tente selecionar a seta à direita e selecione manualmente seu módulo atual, limpe a caixa de texto e pressione Enter. Você também pode tentar pressionar enter dentro da caixa de texto da classe (embora isso geralmente resolva um problema diferente).

Aqui está uma imagem para deixar as coisas mais claras: enter image description here

Byte épico
fonte
70
Para mim, clicar dentro de "Módulo" e pressionar Enter não funcionou de maneira consistente, mas selecionar o campo "Classe" (e pressionar Enter) sempre funcionou.
Imre Kelényi
2
Para mim, a meta foi definida corretamente, mas a classe ainda não apareceu no IB. Notei, no entanto, que o "Local" do arquivo mostrava um caminho "Relativo ao projeto" em vez de "Relativo ao grupo". Remover a referência do arquivo E o grupo e adicioná-lo novamente na raiz do projeto funcionou para mim.
KNL
8
Uau. Obrigado por isso, acho que não teria chegado lá de outra maneira. Isso corrigiu um problema que começou a acontecer depois que eu adicionei @objc(...)a uma das minhas aulas do Swift.
Ndbroadbent
12
Esse problema ainda está presente no XCode 7.2. Esta solução funcionou.
Tom rápido
3
Este ainda é um problema no Xcode 8.3.1 ... uma vergonha
Sepehr Behroozi
99

Às vezes, o Xcode 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">
ChikabuZ
fonte
7
Na verdade, no meu caso, eu tive que remover customModuleProvider, então o erro foi embora.
Maciej Swic 11/03/2015
3
Guillermo, ainda acontecendo no Xcode no final de março!
Ed Manners
3
@MaciejSwic Removendo o customModuleProviderque você fez por mim também, obrigado!
Sakiboy
1
e quanto aos arquivos xib?
SleepsOnNewspapers
7
Ainda acontecendo ... São coisas como esta que me fazem querer chorar :(
Lucas
72

Eu tive esse problema depois de renomear uma classe rápida. Resolvido usando a diretiva @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController
user1760527
fonte
4
Isso corrigiu para mim, eu tinha @objc class Xe mudando para o @objc(X) class Xtrabalhado.
21414 Joe
1
Você também pode tentar excluir seus dados derivados, consulte stackoverflow.com/questions/24039932/…
user1760527
Teve este problema após renomear a classe ViewController padrão do modelo de projeto do Single View. Eu me pergunto o que a magia foi usada para que a @objc()directiva não era necessária para a classe 'original' ViewController ...
Berend Klein Haneveld
Eu vou para o lado oposto. Eu havia especificado o nome do módulo no arquivo Storyboard, mas também adicionei a diretiva @objc.
WeZZard
1
Não funcionou para mim. :( Também não é a solução do nome do módulo de trabalho.
mythicalcoder
64

Projeto com vários alvos

No meu caso, estou trabalhando no projeto com vários destinos e o problema "herdar do destino" foi desmarcado. Selecionar "herdar do destino" resolveu meu problema

insira a descrição da imagem aqui

Muhammad Nayab
fonte
Obrigado por postar isso. Resolvido o problema que estava vendo muito rapidamente.
precisa saber é o seguinte
Eu tive uma situação semelhante. (XCode 9.4.1) Criei um aplicativo iOS chamado FilesTestA, com um UIView personalizado chamado MxFileView (que consistia em MxFileView.swift e MxFileView.xib). Em seguida, adicionei outro destino: um widget Hoje ("FilesTestAWidget"). Solução para usar o MxFileView no widget: (1) class = "MxFileView"; (2) marque "Herdar módulo do destino" (ou desmarque-o e insira manualmente "FilesTestAWidget"); (3) no destino do aplicativo, verifique se MxFileView.swift e MxFileView.xib incluem FilesTestAWidget na associação de destino.
precisa saber é o seguinte
Isso aconteceu comigo em um novo projeto do modelo padrão no Xcode 10.1 (um único destino de aplicativo para iOS e dois destinos de teste). A caixa de seleção estava desmarcada para todos os meus controladores de exibição personalizados (portanto, o texto do espaço reservado era "Nenhum"). Depois de passar e marcar a caixa de seleção para cada controlador de exibição personalizado no meu storyboard, o problema foi resolvido.
Mason
58

Isso funcionou para mim ..

Verifique sua fonte compilada, se esse arquivo (por exemplo, ViewController.m) foi adicionado ou não, no meu caso, o arquivo ViewController não foi adicionado e, portanto, estava me dando o erro.

insira a descrição da imagem aqui

dissidentes
fonte
@CarmenA Você só adiciona arquivos '.m' a Compile Sources. Esta é realmente a solução correta (e apenas) para alguns.
Jacksonkr
Eu tentei várias das outras soluções sem sorte. Isso fez o truque. Por alguma estranha razão, um destino estava faltando o único arquivo de origem que estava me dando ataques.
galactikuh
para mim também .. aconteceu por causa de alguma resolução get conflito
Eldhose
46

Isso pode acontecer em qualquer Xcode acima de 6.0. Aconteceu comigo depois de renomear algumas classes do ViewController no projeto Swift (mas acho que isso também acontecerá com o Obj-C). Você só precisa abrir o construtor de interface, vá para o Identity Inspector do ViewController que teve sua classe renomeada, selecione a classe e pressione Enter. Isso reatribuirá a classe renomeada ao ViewController selecionado e também redefinirá o Valor do módulo, que será perdido após renomear a classe.

Atualização para o Xcode 8.1 (provavelmente 8.0 também):

O Xcode 8.1 apenas trava. Simplesmente e irritantemente apenas trava e não imprime nada. Eu estava perseguindo aquele acidente fantasma por uma hora apenas para descobrir que era exatamente a mesma coisa - classe não atribuída no IB. Se você estiver tendo algumas falhas fantasmas, verifique primeiro o IB quanto a classes não atribuídas.

jovanjovanovic
fonte
obrigado por isso. parece que seguir sua sugestão faz com que o Xcode atualize o módulo (na classe no IB) de Nenhum para Atual. Eu estou pensando que o problema é que simplesmente digitar o nome sem pressionar enter falha ao acionar uma atualização do módulo pelo Xcode.
rockiesGrizzly
Isso funcionou para mim. Renomeei inadvertidamente uma classe de controlador, portanto, obviamente, não existia mais quando o controlador de exibição foi carregado.
Litehouse
32

Às vezes, o controlador que você está fornecendo perde sua associação de destino do aplicativo atual. Nesse caso, pressionar enter no campo "Módulo" não fará nada. Vá para o controlador e verifique se ele tem a associação de destino definida para o aplicativo atual.

Furqan Khan
fonte
Esse também era o problema para mim - vários destinos levam o arquivo de classe a não ser acidentalmente incluído no destino que eu estava construindo.
Ryan Kreager
I fundiu arquivos e perde isso em um dos meus alvos, grande resposta
Benjamin Jimenez
Bom, o mesclar pbx quebrou os valores de associação de destino.
system
32

A ativação Inherit Module From Targetlevou o módulo de destino correto. Isso resolveu o problema.

insira a descrição da imagem aqui

Arnab
fonte
Confirme. Isso me ajudou a resolver o problema.
Chris8447
Normalmente, tenho esse problema ao converter um controlador de exibição de Objective-C para Swift. Digite novamente a última letra e pressione Enter. Deve fazer o truque também.
DevNebulae 29/02
30

Minha resposta: defina o Módulo personalizado igual ao nome do Pod personalizado (no meu exemplo - nome da classe personalizada) como na captura de tela anexada

Esta solução é para um caso específico : para visualizações personalizadas de classes da estrutura Pod (ou Carthage ).

Infraestrutura: XCode8, Swift3

insira a descrição da imagem aqui

Tamara
fonte
18

Corrigi-o fazendo exatamente o oposto do que ChikabuZ sugeriu (no entanto, obrigado por apontar). No arquivo do storyboard, encontre o seguinte:

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

e substitua-o por este:

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

Não consigo acreditar quantas horas estou perdendo por contornar bugs no compilador Swift e no Xcode 6

Orlin Georgiev
fonte
17

Selecionando o apropriado Modulepara o meuCustom Class eu resolvi este problema.

Aqui está :

insira a descrição da imagem aqui

Roy
fonte
13

Eu enfrentei esse problema no Xcode 8 , para resolvê-lo, tive que modificar o storyboard no editor de texto.

Em geral, procure seu controle e remova customModuleecustomModuleProvider da entidade de controle.

Fez um truque para mim.

George Maisuradze
fonte
Hah! Bom hack :)
Vexy
10

Eu tive o mesmo problema.

No meu caso, o Xcode não estava adicionando minha classe personalizada a: Target> Build Phase> Compile Sources.

Portanto, recomendo que você verifique se o seu CustomClass.m está lá.

insira a descrição da imagem aqui

Espero que isso ajude você.

rcmstark
fonte
Foi o que aconteceu comigo e, felizmente, encontrei minha saída! Eu estava vindo aqui para responder, mas você foi o primeiro. Obrigado!!!
Gabriel Piffaretti
9

Eu enfrentei esse problema no Xcode 6.1 quando removi Main.storyboardo LaunchScreen.xibarquivo e as ViewControllerclasses padrão do meu projeto.

Corrigi-o excluindo as entradas Launch Screen Filee Main InterfacedeInfo.plist

Vinay Jain
fonte
9

Verifique se a sua turma tem a Associação Alvo correta .

Jakub Truhlář
fonte
8

Eu pesquisei em todo lugar por isso. Nenhuma das respostas funciona para mim até conhecer um cara que me pediu para mover minha pasta do projeto para a área de trabalho. Apenas funcionou automaticamente. Aparentemente, se você projetar uma pasta para o fundo de muitas pastas, o XCODE realmente será interrompido.

VBaarathi
fonte
Eu tenho esse problema no Xcode 7 beta 5 novamente, uma vez que o peguei no Xcode 6 antes. Desta vez, este método funciona para mim.
Jake Lin
1
No visual studio, existe um problema semelhante. Mas por lá, recebemos uma mensagem de aviso clara dizendo que o caminho é muito longo e as coisas não podem ser adicionadas ou editadas. Não tenho certeza se é a mesma coisa com o XCODE, mas após esse episódio eu mantenho todos os meus projetos em documentos ou na área de trabalho e nunca mais tive esse problema. Eu mesmo deu este conselho a alguém usando Xamarin Studio e ele também trabalhou para eles ...
VBaarathi
7

Estes passos funcionam para mim.

1) Limpar dados derivados.
2) Remova os arquivos. He.
3) Crie os arquivos. He.

ARWIN
fonte
Isso funcionou para mim também. Até o fiz funcionar sem limpar os dados derivados.
Jaytrixz
Isto foi trabalhado para mim, muito obrigado Arwin, Mas eu ainda não estou recebendo por isso é levantar tal erro porque eu não modifica nada na classe ou na IB antes
Kirtikumar A.
7

Resolvi isso abrindo meu arquivo de storyboard como código-fonte e usando o comando-F para procurar minha classe desconhecida e excluir a classe personalizada associada a ela.

Wraithseeker
fonte
6

O que o @gfrs disse está correto, você precisa definir o Módulo. No entanto, uma vez encontrei um problema em que minha turma não estava listada no Classmenu suspenso. Eventualmente, removi o arquivo swift, reiniciei o Xcode e recriei o arquivo. Finalmente, a turma foi listada e poderia ser usada no Storyboard.

Veja também esta resposta , que parece resolver o problema 'real' que encontrei.

Bouke
fonte
Remover e adicionar novamente o arquivo de classe funcionou para mim. Obrigado!
Nicolas Miari
6

Resolvi esse problema digitando o nome do módulo (infelizmente, a lista suspensa não mostrará nada ...) na classe personalizada do inspetor de identidade de todos os controladores e visualizações do View.

Você também pode precisar indicar o provedor de destino. Para atingir esse objetivo, você pode abrir o storyboard no modo de código-fonte e adicionar o atributo "customModuleProvider" nos suportes ViewController e View angle.

Teng Long
fonte
6

Minha solução (Xcode 8.1 Swift 3.0):

Classe desconhecida xxx no arquivo do Interface Builder.

Abra o StoryBoard como código-fonte e procure por xxx . Remova o atributo que contém o valor xxx . Construir e executar.

ibrahimyilmaz
fonte
WTF? Isso foi absolutamente necessário para mim, obrigado. Eu tive que excluir ocustomModule="" customModuleProvider=""
Dan Rosenstark
1
Se tentarmos publicar um aplicativo na loja de aplicativos que contenha um erro como esse, o aplicativo será recusado sem pensar.
Ibrahimyilmaz 11/01
Discordo. Acabei de enviar uma versão que precisei modificar dessa maneira para o TestFlight e ela está pronta para testes beta ... veremos o que acontece na loja de aplicativos real, mas é um IMO de bug do IB. Obrigado!
Dan Rosenstark
4

No meu caso, eu adicionei uma bandeira -ObjCpara Other Linker Flagsem configurações de projeto para que ele funcione. Também tentei com -all_loadbandeira e funcionou bem também.

insira a descrição da imagem aqui

Rostyslav Druzhchenko
fonte
3

No meu caso, a classe mencionada no Storyboard / xib não tinha a Associação de Destino definida.

Para corrigir, forneça aos arquivos .he classes .mdessa mesma associação de destino das outras classes.

Nenhuma associação de destino definida.

pkamb
fonte
Esse era o meu problema, mas, ao tentar várias soluções, causei o problema que a resposta da Epic Byte corrige. Você deve ter seu código-fonte no destino que está construindo, mas também no IB, você precisa definir o controlador de exibição para fazer parte do destino atual.
SafeFastExpressive
Ser membro do alvo também era meu problema, procurado em todos os lugares, mas graças a esta resposta eu consegui resolvê-lo.
Borzh
3

Minha solução foi remover @objc da definição de classe personalizada.

DenisKirillov
fonte
2
Algum exemplo com explicação seria ótimo.
Nilambar Sharma
2

Eu enfrentei o problema ao transportar o storyboard do projeto Swift para o projeto Objective-c, percebendo a resposta de vvkuznetsov , que revelou os dois projetos usando o mesmo identificador. I "Produto -> Limpar" e toque na tecla Enter no campo de texto Módulo e Classe. a questão foi embora.

xhg
fonte
2

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.

Jignesh Kalantri
fonte
2

Meu problema foi com o erro do usuário. Eu tinha um UIView genérico no meu storyboard e na seção Custom Class do Identity Inspector, acidentalmente alterei o nome de UIView para sem sentido.

Tudo o que foi necessário para corrigir foi alterá-lo novamente para o UIView.

Lambreta
fonte
Fiz a mesma coisa, mas adicionei acidentalmente o nome de Custom View Controllers à seção de classe personalizada do ViewControllers root view. Então, eu estava olhando para ver por que o View Controller não foi encontrado quando era a visualização raiz o tempo todo.
TMin
1

O que só funcionou para mim é realmente adicionar o nome do módulo ao arquivo xib ...

Então, os arquivos xib ficam assim:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

Solução HORRÍVEL na minha opinião, mas é supostamente como a Apple quer que façamos isso agora.

Esta pergunta mostra três possíveis soluções de volta ao beta 4 ... aparentemente a Apple não foi muito útil nessa situação, segundo alguns, porque eles chamam de "Trabalhando como pretendido".

SH
fonte
1

Eu tive o mesmo problema com o Xcode versão 6.1 (6A1052d). Acho que o problema aparece se você renomeou seu projeto App / Xcode.

Minha solução foi adicionar o nome do módulo no construtor de interface manualmente.

patrickS
fonte
1

Eu tive esse problema depois que adicionei um novo destino e criei uma nova classe usando a caixa de diálogo 'Novo arquivo', mas falhei acidentalmente ao verificar o novo destino e o destino original na caixa de diálogo de criação, para que o objeto fosse adicionado apenas ao meu alvo original. A solução foi excluir os arquivos de origem (remover apenas a referência) e adicioná-los novamente usando 'Adicionar arquivos', desta vez verificando os dois destinos.

JulianSymes
fonte