Estou tentando vincular um UILabel
com um IBOutlet
criado na minha classe.
Meu aplicativo está travando com o seguinte erro.
O que isto significa?
Como posso corrigir isso?
*** Finalizando o aplicativo devido à exceção não capturada 'NSUnknownKeyException', motivo: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: essa classe não é compatível com a codificação de valor-chave para a chave XXX.'
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
fonte
fonte
Respostas:
Seu controlador de exibição pode ter a classe errada no seu xib.
Eu baixei seu projeto.
O erro que você está recebendo é
É causado pelo
Second
controlador de exibição emMainWindow.xib
ter uma classe emUIViewController
vez deSecondView
. Mudar para a classe correta resolve o problema.A propósito, é uma má prática ter nomes como "string" no Objective-C. Convida uma colisão de nomeação em tempo de execução. Evite-os mesmo em aplicativos de prática única. As colisões de nomes podem ser muito difíceis de rastrear e você não quer perder tempo.
Outro motivo possível para esse erro: ao copiar e colar elementos de um controlador em outro, o Xcode mantém de alguma forma esse link para o controlador original, mesmo depois de editar e vincular novamente esse elemento no novo controlador.
Outro motivo possível para esse erro:
Tomada ruim.
Você removeu ou renomeou o nome de uma saída no seu
.h
arquivo.Remova-o no
.xib
ou.storyboard
no Inspetor de conexões do arquivo.Mais uma razão possível
(No meu caso) A extensão do UIView com propriedades vinculáveis e valores de configuração para essas propriedades vinculativas (por exemplo, sombra, raio do canto etc.) remova essas propriedades da extensão UIView (por algum motivo), mas o seguinte
<userDefinedRuntimeAttributes>
permaneceu no xml (defoo.storyboard
):Solução: Clique com o botão direito do mouse em
foo.storyboard
> Abrir como código-fonte> pesquise por keyPath (por exemplo, shadowRadius)> Exclua o</userDefinedRuntimeAttributes>
que está causando o problemafonte
Você pode ter uma conexão ruim no seu xib.
Eu já tive esse erro várias vezes. Embora a resposta da TechZen esteja absolutamente correta nesse caso, outra causa comum é quando você altera o nome de uma propriedade IBOutlet em seu arquivo .h / .m, que você já conectou ao proprietário do arquivo na ponta.
Do seu bico:
Em 'Referencing Outlets', verifique se o objeto ainda não está conectado ao nome da propriedade antiga ... se estiver, clique no pequeno 'x' para excluir a referência e criar novamente.
Outra causa comum, se você estiver usando o Storyboard, seu UIButton pode ter mais de uma atribuição (a solução é quase a mesma da ponta):
Você verá que há mais de uma atribuição / referência a este botão. Remova uma das janelas cinza "Principal ..." com o pequeno "x":
fonte
Eu tive que excluir o aplicativo do simulador / iPhone para me livrar desse erro.
fonte
Eu tive esse erro quando estava tentando implementar um ViewCell personalizado para uma tabela. Quando destaquei o View controller para o XIB e me conectei aos elementos no CellView, ocorreu o erro "essa classe não é compatível com a codificação do valor da chave", depois que eu os excluí, ele se livrava do erro.
Exclua as conexões na imagem abaixo.
Apenas certifique-se de ter apenas as conexões com a célula de exibição de tabela. Para verificar, clique na célula de exibição de tabela e, em INSPECTOR, procure suas conexões.
fonte
Às vezes, isso tem a ver com o "Herdar do destino". Esse valor deve ser definido. Com aplicativos de destino único, você pode apenas selecionar Herdar do destino. Se você tiver mais de um alvo, selecione o alvo desejado.
fonte
Se for um aplicativo exclusivo para iPhone, não universal, verifique se o campo a seguir está vazio:
Destinos> Resumo> Informações de implantação do iPhone / iPod> Interface principal
Se você especificar um xib, ele trava.
fonte
Este erro indica que um objeto do Interface Builder já conectado foi removido / renomeado na origem do proprietário (Proprietário do arquivo).
Clique com a tecla Control pressionada no Proprietário dos arquivos no Interface Builder se você vir um ponto de exclamação para corrigir isso.
Na figura abaixo, você pode ver que "aRemovedView" tem um ponto de exclamação à direita, porque removi o objeto de exibição IBOutlet enquanto ele já estava conectado no IB.
Isso fornece o seguinte erro: Finalizando o aplicativo devido à exceção não capturada 'NSUnknownKeyException', motivo: '[setValue: forUndefinedKey:]: esta classe não é compatível com a codificação do valor da chave para a chave aRemovedView.'
fonte
Eu tinha o mesmo problema e, embora a resposta da TechZen possa ser realmente surpreendente, achei difícil aplicar a minha situação.
Eventualmente, resolvi o problema vinculando o rótulo por meio do controlador listado em Objetos (destacado na imagem abaixo) e não pelo proprietário do arquivo .
Espero que isto ajude.
fonte
no meu caso, houve um erro no código-fonte do storyboard, siga estas etapas:
<connections>
Por exemplo:
Como você vê, essas são conexões entre os nomes das variáveis de código e as tags xml do layout do storyboard;)
fonte
Minha correção foi semelhante à de Gerard Grundy's. Ao criar um UITableViewCell personalizado usando um XIB, apliquei por engano o nome da Classe Personalizada ao Proprietário do Arquivo, em vez de ao UITableViewCell. Aplicar a classe ao UITableViewCell na tela e conectar minhas propriedades IBOutlet a ele resolveu o problema.
fonte
IBOutlet
uma vez, oIBOutlet
rótulo que seu ivar é desnecessário.UIViewController
? Em algum momento você deveria estar ligando[SecondView initWithNibName:@"yourNibName" bundle:nil];
fonte
-initWithNibName
com o nome errado da ponta.Isso estava acontecendo comigo apenas durante a depuração em um dispositivo (iPhone). O iOS Simulator estava funcionando bem. Fazer um "Produto-> Limpo" do Xcode parecia resolver o problema, mas não tenho idéia do porquê.
fonte
Eu tinha exatamente a mesma mensagem de erro e, graças (!!) a Kira, de http://www.idev101.com, fui capaz de resolver o desafio. Eu só encontrei o site dela depois de pesquisar e empilhar sobre todos esses tópicos. Agora estou postando aqui o próximo que vem ao StackOverFlow e tem o mesmo desafio que eu, já que essa pessoa provavelmente chegará a esse segmento no Google.
Eu percebi que fiz errado isso:
Em vez disso:
Onde
O nome da minha turma também era conhecido como
Você terá que
na sua implementação (arquivo .m) onde você deseja chamar, por exemplo, outro UIViewController.
Não sinto muito se estou apenas afirmando o óbvio para iniciantes como eu e posso receber votos, pois isso não está exatamente relacionado à pergunta, mas eu estava procurando 4 (?!?) Horas seguidas agora pela resposta a essas mensagens de erro . Se eu puder poupar isso para 1 ou 2 pessoas, seria ótimo :)
PS: Para aqueles interessados em como o código continua carregando o outro UIViewController:
fonte
Pode resultar do fato de você ter o controle arrastado e criado uma saída ou ação e ter esquecido de excluí-lo. Mesmo que você tenha excluído o código, ou mesmo se você tiver cmd + Z suficiente, precisará entrar no inspetor de conexão do seu storyboard e verificar se a ação ou saída criada ainda está aqui ou não.
fonte
Examinando as outras respostas, parece que existem muitas coisas que podem causar esse erro. Aqui está mais um.
Se vocês
Você também pode receber um erro semelhante a
A solução é excluir a propriedade antiga.
Abra o Inspetor de identidade da sua turma, selecione o nome da propriedade em Atributos de tempo de execução definidos pelo usuário e pressione o botão de menos (-).
fonte
Isso acontece comigo quando meu controlador de exibição originalmente tinha um arquivo .xib, mas agora é criado programaticamente.
Mesmo que eu tenha excluído o arquivo .xib deste projeto. Os usuários iPhone / iPad podem conter arquivos .xib para este controlador de exibição.
Tentar carregar um arquivo .xib geralmente causa esta falha:
A solução ao criá-lo programaticamente pode ser esta:
fonte
A propriedade "Module" do View Controller no Identity Inspector pode ser diferente do que você esperava. Verifique também se novas classes foram adicionadas à sua lista de destinos.
fonte
Eu tive um problema semelhante para um projeto que tem dois destinos (com seu próprio MainWindow XIB). O problema fundamental que causou esse erro para mim foi que a classe UIViewController não foi incluída na lista de recursos do segundo projeto. Ou seja, o construtor de interface me permitiu especificá-lo no MainWindow.xib, mas em tempo de execução o sistema não conseguiu localizar a classe.
Ou seja, clique com o botão direito do mouse na classe UIViewController em questão e verifique se está incluída na guia 'Destinos'.
fonte
Só para adicionar isso, porque eu estava recebendo esse erro também. Ao passar por todas essas respostas, a maioria parece se aplicar ao trabalho com a interface do usuário e o material do storyboard. Eu sei que o pôster original parecia estar funcionando com a interface do usuário, mas, ao procurar possíveis razões para esse erro, quase todas as perguntas levam a essa pergunta, com as outras sendo fechadas como duplicatas ou simplesmente tendo problemas para conectar as coisas em um storyboard, então adicione minha solução.
Eu estava trabalhando na codificação de um serviço da Web no Swift 2. Criei todos os objetos e stubs de proxy necessários. Enquanto eu percorria o XML retornado, instanciava dinamicamente meus objetos, os quais eram provenientes
NSObject
e usadossetValue:forKey
neles. Toda vez quesetValue:forKey
tentava definir uma propriedade, ela explodia com esse erro.Eu tive uma instrução switch para cada tipo eu estava lidando com (por exemplo
Bool?
,CShort?
,String?
) e para cada nó XML que eu passei e verificado que o tipo era sobre o objeto e, em seguida, convertido o valor para esse tipo e tentou configurá-lo comsetValue:forKey
.Eventualmente, comecei a comentar todas essas
setValue:forKey
linhas e descobri que meudefault
caso de declaração de chave funcionavaString?
.Finalmente descobri que você não pode usar tipos swift opcionais, a
setValue:forKey
menos que eles tenham um mapeamento direto para um tipo Objective-C comoString?
ouNSNumber?
. Acabei alterando todos osCShort?
tipos para,NSNumber?
uma vez que possui um mapeamento direto. PoisBool?
no meu caso, era bom apenas usarBool
e inicializá-lofalse
. Outros podem não ter esse luxo.De qualquer forma, que dor de cabeça que foi tão esperançosamente isso ajuda alguém que tem um problema semelhante e continua sendo redirecionado para esta pergunta e dizendo para si mesmo: "Não estou fazendo nada na interface do usuário !!".
Por fim, reiterar mais uma vez a codificação de valor-chave não funciona com opcionais. Abaixo, acabei encontrando algum lugar, mas esqueço onde, para quem postou isso, peço desculpas e daria crédito se me lembrasse de onde encontrei isso, mas ele salvou minha vida:
fonte
"esta classe não é compatível com a codificação do valor da chave" Eu sei que é um pouco tarde, mas minha resposta é diferente, então acho que precisa ser publicada, eu estava pressionando o segundo controlador de maneira incorreta, aqui está uma amostra
Maneira errada de empurrar o controlador
Maneira correta
Eu não encontrei nenhuma resposta como acima, por isso pode ajudar alguém com o mesmo problema
fonte
Pode ser o caso de fazer referência a um componente da interface Xib que você renomeou ou excluiu. A referência novamente funciona para mim.
fonte
Acabei de ter esse problema no meu projeto duplicado e resolvi verificando dois locais:
1- Certifique-se de ter o arquivo .m na lista -> Projeto - Fases de compilação - Fontes de compilação
2- Depois disso, vá para o construtor de interfaces (provavelmente ocorre um erro apenas com o IB) e desvincule todas as propriedades, rótulos e imagens , etc ... Em seguida, reconecte todos. Percebi que removi um atributo, mas ele ainda estava vinculado no IB.
Espero que funcione para alguns.
fonte
Outro problema "não compatível" que encontrei foi quando, por algum motivo, consegui duas cópias de uma aula.
Eu estava adicionando chaves à cópia errada. O Interface Builder ainda viu as chaves e me permitiu conectá-las, mas em tempo de execução, ele estava usando a outra cópia da classe que não possuía as novas chaves.
Para descobrir qual era a cópia "correta", usei o cmd-clique do XCode no nome da classe em outro lugar para pular para a cópia correta, depois acabei com as cópias ruins não utilizadas (depois de trazer minhas edições da cópia não usada primeiro).
Moral da história: arquivos duplicados de turma são ruins.
fonte
Este erro é outra coisa!
Aqui está como eu corrigi-lo. Estou usando a versão 6.1.1 do xcode e swift. Eu recebia esse erro toda vez que meu aplicativo tentava executar uma sequência para ir para a próxima tela. Aqui o que eu fiz.
Felicidades,
fonte
Eu tive o mesmo sintoma. A causa raiz foi que a "Associação de Destino" para o meu arquivo de origem não foi definida como o destino correto. Suponho que isso signifique que minha classe não seria criada e incluída no meu aplicativo.
Para corrigi-lo:
Espero que isso ajude alguém lá fora.
fonte
Se você tem uma subclasse UIViewController personalizada com IBOutlets que está causando problemas, o único conjunto de etapas que encontrei para realmente livrar-me do erro foi
.1 Altere a classe para UIViewController
.2 Desconecte todas as tomadas (todas elas terão o triângulo de advertência amarelo agora) - pode ser o suficiente apenas para desconectar as tomadas problemáticas.
.3 Execute todas as etapas padrão - ↑ ⌘K, apague Dados Derivados (, colchonetes, contas de preocupação)
.4 Inicie o aplicativo - vá para a cena problemática.
.5 Mate o aplicativo, volte ao Interface Builder e altere a classe de volta ao seu nome de classe personalizado.
.6 Reconecte suas tomadas.
Inicie o aplicativo e isso normalmente esclarecerá os problemas de conformidade com o valor-chave.
fonte
No meu caso. Não havia pontos ausentes nos arquivos xib após a mesclagem.
resolveu meu problema. Limpei meu projeto e reconstruí-lo.
fonte
No meu caso, isso foi causado pela referência ao Nib errado:
fonte
Eu estava recebendo esse erro com storyboards. A solução acima não parecia ser o problema, então acabei excluindo o controlador de exibição e adicionando-o novamente (e, é claro, reconectando o segue e reatribuindo a classe) que o corrigiu. Não sei o que realmente era, mas havia renomeado a classe de controlador de exibição associada pouco antes do início, então talvez isso tenha manejado alguma coisa.
fonte
Eu tenho o mesmo problema. Eu fiz redefinindo o simulador. Removendo e adicionando controle de botão. e finalmente fez uma limpeza. :) Graças ao estouro de pilha. De alguma forma, como meu código ficou bom e começou a funcionar.
fonte