Xcode - Como corrigir 'NSUnknownKeyException', motivo:… esta classe não é compatível com a codificação do valor da chave para o erro da chave X "?

1172

Estou tentando vincular um UILabelcom um IBOutletcriado 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.'

Guillaume Dubois
fonte
11
pedrotorres está certo. Sim, isso está certo. Se você estiver executando um UITableViewCell, no IB, lembre-se de transformar o Proprietário do arquivo em NSObject e o UITableViewCell'Class na classe .h que você definiu.
Giuseppe
3
Quando você encontra esse problema e a chave incorreta é uma ação, e não uma saída , provavelmente você tem uma saída que referencia por engano o nome da função de ação em vez do nome da variável da saída .
Alex Yursha
2
Você deve observar que o nome da chave na mensagem de erro (o OP está chamando de 'XXXX') é o nome que você deu a algo em seu arquivo de ponta. Isso deve ajudar a restringir sua pesquisa.
kris
Arquivei rdar: // 22105925 pedindo à Apple para tornar esses erros mais óbvios no momento da criação. :)
jtbandes
como realmente resolver o problema IMEDIATAMENTE! stackoverflow.com/a/13812660/294884 dica fantástica
Fattie

Respostas:

980

Seu controlador de exibição pode ter a classe errada no seu xib.

Eu baixei seu projeto.

O erro que você está recebendo é

'NSUnknownKeyException', motivo: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: esta classe não é compatível com a codificação do valor da chave para a cadeia de chaves.'

É causado pelo Secondcontrolador de exibição em MainWindow.xibter uma classe em UIViewControllervez 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 .harquivo.

Remova-o no .xibou .storyboardno 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 (de foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

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 problema

Hassan Tareq
fonte
9
Também não se esqueça de conectar a saída "view" da ponta à saída do proprietário do arquivo (a saída da sua classe personalizada herdada do UIViewController). Isso pode ser feito arrastando o controle de "Proprietário do arquivo" em "Place Holders" para "view" em "Objects" e selecionando a saída de exibição.
Nirma
1
Tenho a certeza toda a classe já estão definidos, mas o NSUnknownKeyException ainda sai :(
Zennichimaro
1
Nem estou usando o Interface Builder e ainda estou recebendo esse erro. Alguma idéia do que está acontecendo?
Sudo
12
Deixa pra lá. Foi por causa de duas coisas: o Xcode ainda estava acessando o meu storyboard principal, apesar de ter sido removido do projeto, e o simulador o tinha armazenado em cache. Eu não recomendo o uso de storyboards ou NIBs - eles são ridiculamente problemáticos.
Sudo
5
@Josh Lol. Toda vez que desenvolvo a motivação para criar um aplicativo nativo no xcode, sempre termina comigo passando um dia tentando descobrir como fazer qualquer coisa. Como sou ativista, tenho procurado ofertas de Xamarin e Telerik (nativescript) recentemente.
The Muffin Man
1524

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:

  1. Selecione o objeto no IB e vá para o 'Connections Inspector'.
  2. 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.

    insira a descrição da imagem aqui

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):

  1. Abra seu storyboard e clique com o botão direito do mouse no UIButton
  2. 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":

    exemplo 2

OhadM
fonte
1
Obrigado! No meu caso, eu tinha duas saídas para a mesma visualização, e me livrar da antiga e ligar a visualização à nova encerrou a exceção.
22415 Mark-Patterson-
o meu foi duplicado duas vezes. Comecei a desconectar cada um depois de arrastar e soltar de uma versão Pro (de uma versão Lite), pensando que estava pendurada em conexões no outro projeto. Quando me deparei com a duplicata, e foram necessários três cliques para fazer a desconexão, sinceramente desejei ter feito isso três dias antes. Oh, bem, essa é a vida de um desenvolvedor.
Aremvee
Eu tive o problema de o UIButton estar tendo mais de uma tarefa. Isso resolveu meu problema.
Mythicalcoder
Eu tive esse problema também. Não se esqueça de verificar as conexões de tomada em vistas específicas, em vez de apenas superviews. No meu caso, as superviews não estavam mostrando as conexões erradas = /
Augusto Carmo
Eu tinha um erro semelhante onde eu ligada uma tomada de botão para um arquivo rápida ViewController errado cuja página não teria sido ainda criada usando o GUI
brw59
114

Eu tive que excluir o aplicativo do simulador / iPhone para me livrar desse erro.

Steve Rogers
fonte
1
+1 corrigiu isso para mim. Eu estava limpando algum código que usava o IB. Quando eu excluí um botão do código, o erro continuava aparecendo, mesmo quando esse botão não era mencionado nos arquivos da ponta (pelo menos, eu podia ver).
Segunda
2
Acho que isso é necessário se você estiver depurando dois aplicativos com o mesmo nome.
31513 Anton
Sim, parece que algo do XIB está armazenado em cache no simulador, o que é uma dor se você estiver testando atualizações, pois na verdade não deseja excluir o aplicativo antigo.
Carlos P
Eu tive esse problema ao excluir meu arquivo XIB. Isso resolveu o problema.
balboa
4
Se a exclusão do aplicativo não funcionar, tente excluir a pasta XCode DerivedData. que pode armazenar em cache um arquivo xib incorreto. Abra XCode -> Preferências -> Locais -> Abra a pasta DerivedData e arraste-a para a Lixeira.
Philip Fung
107

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. Exclua as conexões no inspetor quando o Dono do arquivo estiver realçado

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.

A conexão deve estar aqui quando a célula de exibição de tabela estiver destacada

uplearnedu.com
fonte
4
Isso fez por mim, muito obrigado. Limpei as conexões quando "Dono do arquivo" foi selecionado na coluna da esquerda, selecionei minha célula personalizada e as reconectou. Sucesso!
Rogare 4/14/14
Mesmo com o xcode7 isso funciona, basta usar o painel direito "Inspetor de conexões". Remova a tomada da tableviewcell e da etiqueta e adicione-a novamente e tudo deve funcionar.
lifeisfoo
3
Isso funciona, mas você precisa se certificar de que o FileOwner não foi configurado! O proprietário do arquivo deve permanecer NSObject. stackoverflow.com/questions/13793162/…
devjme 27/02
A mesma resposta me salvou duas vezes!
precisa saber é
99

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

insira a descrição da imagem aqui

Shruti Thombre
fonte
Essa resposta me ajudou em um caso específico. Eu tenho que continuar trabalhando em um projeto obj-c antigo com vários destinos. Criei um UITableViewCell personalizado no Swift e tive o mesmo erro. Ao ativar "Herdar do destino", funcionou. Obrigado!
magohamoth
O módulo nem sempre está definido corretamente; por exemplo, se você preencher o nome da turma antes de realmente criar a turma.
22417 Johan Johan
Eu preenchi o nome da classe sem pressionar a tecla "Enter" no final, para que o IDE não verificasse esse sinalizador automaticamente. Perdeu 1 hora com isso. Obrigado.
MatPag 17/08/19
Nunca encontrou esse tipo de erro no obj-c. Mas graças a sua resolveu o mistério.
Pradeep Kachhawaha 13/09/19
por que isso está enterrado na 3ª página?
14743 Sergio Sergio
65

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.

erkanyildiz
fonte
2
Sim, foi isso para mim. Enquanto mexia para adicionar um novo controlador de exibição de inicialização, configurei isso para a nova classe / ponta. Depois de ligar a tomada de visão, estava atingindo este erro. Limpar este campo o corrigiu.
terriblememory
Isso funcionou para mim. Observe que eu também tive que excluir a versão antiga do dispositivo / simulador para que funcionasse.
jimt
Obrigado - este foi o meu problema. Renomeei o arquivo de storyboard do iPad e não atualizei as preferências do meu projeto.
RobertJoseph
2
Obrigado! Isso resolveu para mim. (Eu tive que excluir o aplicativo do simulador depois de alterar o campo da interface principal para ficar vazio. Simplesmente alterar esse campo não forçou o simulador a interromper o cache.) #
31313 snipe
Lembrei-me de que eu mudei as coisas de um aplicativo universal para um aplicativo somente para iPhone e isso corrigiu o erro!
Justin Justin
59

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.

insira a descrição da imagem aqui

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

Tibidabo
fonte
Obrigado! Isso consertou para mim. Estou com esse problema há muito tempo e não sabia como corrigi-lo, a não ser começar do zero. Foi isso, excluiu o IBOutlets do controlador de exibição, mas não sabia que eles ainda estavam referenciados / vinculados no proprietário (neste caso, "View Controller" no construtor de interface - Xcode 6).
Ira Herman
41

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.

insira a descrição da imagem aqui

Eric Brotto
fonte
37

no meu caso, houve um erro no código-fonte do storyboard, siga estas etapas:

  1. primeiro abra seu storyboard como código fonte
  2. procurar por <connections>
  3. remover conexões indesejadas

Por exemplo:

<connections>
    <outlet property="mapPostsView" destination="4EV-NK-Bhn" id="ubM-Z6-mwl"/>
    <outlet property="mapView" destination="kx6-TV-oQg" id="4wY-jv-Ih6"/>
    <outlet property="sidebarButton" destination="6UH-BZ-60q" id="8Yz-5G-HpY"/>
</connections>

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;)

tarifa namrouti
fonte
33

insira a descrição da imagem aqui insira a descrição da imagem aqui

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.

ashack
fonte
Ayyy dag nab it ... Não posso acreditar quantas vezes eu cometo esse erro. Obrigado lol
Benjamin
31
  1. Você só precisa especificar IBOutletuma vez, oIBOutlet rótulo que seu ivar é desnecessário.
  2. Você está instanciando seu NIB usando o seu UIViewController? Em algum momento você deveria estar ligando[SecondView initWithNibName:@"yourNibName" bundle:nil];
kubi
fonte
Isso ajudou! Eu estava recebendo um erro de conformidade de codificação de valor-chave sobre uma propriedade de um controlador de exibição diferente. Acontece que eu estava ligando -initWithNibNamecom o nome errado da ponta.
jlstrecker
Sim, isso também me ajudou .. eu estava usando o UIViewController em vez de MyCustomeViewController .. mas esse é um tipo de problema de hierarquia .. a introspecção falhou por causa do objeto de classe colocado incorretamente .. Obrigado de qualquer forma
Futur
Eu tive uma questão semelhante. Duas entradas idênticas do IBAction por acidente. Não apareceu no código, apenas com o botão direito do mouse no UIControl (A UIStepper no meu caso). Apenas excluir um consertou.
Dave Hubbard
30

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

Maj
fonte
Isso resolve meu problema. tsk2x quase 3 dias de dor de cabeça.
precisa saber é o seguinte
5
Ele fornece uma resposta para a pergunta. Algo ficou bagunçado no Nib e limpar tudo resolveu. Eu li e tentei todas as opções acima sem sucesso e, em seguida, fiz a limpeza e, após 1 hora tentando consertá-lo, a solução do Maj o consertou. Eu adoraria ver o que no XML poderia ter causado isso, mas segui em frente.
LevinsonTechnologies
Isso realmente resolve o problema - tentei várias sugestões acima e o projeto apenas corrigiu esse erro que de repente começou a ocorrer. Ugg ...
DustinB
Isso corrigiu meu problema, tentei várias sugestões acima. Parece estranho!
Naveen Shan
23

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:

UIViewController *deviceViewController = [[UIViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Em vez disso:

DeviceViewController *deviceViewController = [[DeviceViewController alloc] initWithNibName:@"DeviceViewController" bundle:nil];

Onde

DeviceViewController

O nome da minha turma também era conhecido como

DeviceViewController.h 
DeviceViewController.m

Você terá que

"import DeviceViewController.h"

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:

    [self presentViewController:deviceViewController animated:YES completion:nil];
Yannis
fonte
Obrigado por todas as etapas, eu estava usando o Xcode 5 e realmente não sabia como adicionar manualmente uma ponta, pois você só pode adicionar storyboard por padrão ... Eu recebi algumas instruções, mas não tão detalhadas quanto a sua. Realmente ajudou !!
Pittfall
"Eu fiz isso errado ..." obrigado, não é a primeira vez que gasto muito por causa desse erro realmente estúpido
tontonCD
23

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.

Ilansky Naftali
fonte
Obrigado! Eu sou um n00b no Xcode e demorei um pouco para encontrar os links desonestos. No Xcode 9.2, você pode clicar com o botão direito do mouse no elemento na exibição de storyboard e verificar as "Referências".
Kunigami
21

Examinando as outras respostas, parece que existem muitas coisas que podem causar esse erro. Aqui está mais um.

Se vocês

  • ter uma visão personalizada
  • adicionou uma propriedade @IBInspectable
  • e depois o excluiu

Você também pode receber um erro semelhante a

Falha ao definir (xxx) a propriedade inspecionada definida pelo usuário em [Your Custom View] ...: esta classe não é compatível com a codificação do valor da chave para a chave [xxx].

A solução é excluir a propriedade antiga.

insira a descrição da imagem aqui

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 (-).

Suragch
fonte
Eu vim tantas vezes nesta página ... Desta vez, esta solução chegou! Mas, por mais estranho que pareça, a propriedade antiga a ser excluída estava em outro ViewController do que aquela que trava, não sei por quê.
Cinn
15

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:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

A solução ao criá-lo programaticamente pode ser esta:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}
neoneye
fonte
12

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.

ercu
fonte
votando desde que era assim no meu caso. Estou usando Swift e Storyboards. Quando criei um novo destino de criação (para criar uma variante de construção), o aplicativo não funcionou na nova variante, enquanto o primeiro funcionou bem. O aplicativo travou em um View Controller em que o nome do módulo foi de alguma forma definido para o módulo a partir do primeiro destino, enquanto no View Controllers de trabalho estava Atual - <nome do módulo aqui> . Você precisa apagar o nome do módulo nesse caso.
Mixaz 26/04
11

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

David Carney
fonte
9

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 NSObjecte usados setValue:forKeyneles. Toda vez que setValue:forKeytentava 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 com setValue:forKey.

Eventualmente, comecei a comentar todas essas setValue:forKeylinhas e descobri que meu defaultcaso de declaração de chave funcionava String?.

Finalmente descobri que você não pode usar tipos swift opcionais, a setValue:forKeymenos que eles tenham um mapeamento direto para um tipo Objective-C como String?ou NSNumber?. Acabei alterando todos os CShort?tipos para, NSNumber?uma vez que possui um mapeamento direto. Pois Bool?no meu caso, era bom apenas usar Boole inicializá-lo false. 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:

Você não pode usar o KVC em uma propriedade Int opcional, porque o KVC é cacau / Objective-C e o Objective-C não pode ver um Int opcional - ele não é vinculado ao Objective-C. O Objective-C pode ver apenas os tipos com ponte para o Objective-C:

tipos de classe que são derivados de NSObject

tipos de classe que são expostos com @objc

Estruturas rápidas em ponte

AteuP3ace
fonte
1
Se você estiver tentando conectar um valor booleano Swift por meio de ligações do Cocoa, precisará expô-lo com a diretiva @objc; caso contrário, você realmente receberá esse erro. Essa deve ser a melhor resposta.
jvarela
9

"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

UIViewController* controller = [[UIViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Maneira correta

TempViewController* controller = [[TempViewController
 alloc]initWithNibName:@"TempViewController" bundle:nil];
         [self.navigationController pushViewController:controller animated:true];

Eu não encontrei nenhuma resposta como acima, por isso pode ajudar alguém com o mesmo problema

Muhammad Ammad
fonte
8

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.

MehrozKarim
fonte
8

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.

kubilay
fonte
7

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.

Jason
fonte
7

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.

  1. Verifiquei se o botão estava conectado à ação correta (este não foi o problema, mas ainda assim é bom verificar)
  2. Verifique se o botão não possui nenhuma ação ou tomada adicional que você tenha criado por engano. (Este não foi o problema, mas ainda é bom verificar)
  3. Verifique os logs e certifique-se de que todos os botões na NEXT SCREEN tenham as ações corretas e, se houver alguma sequência, verifique se eles têm um identificador exclusivo. (Este foi o problema)
    • Um dos segues não tinha um identificador exclusivo
    • Um dos botões teve uma ação e duas saídas que criei por engano.
    • Exclua todas as tomadas adicionais e verifique se os seguintes passos para a próxima tela possuem identificadores exclusivos.

Felicidades,

Ronaldoh1
fonte
6

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:

  1. Realce seu arquivo .m.
  2. No painel direito, selecione o Inspetor de arquivos.
  3. Na seção "Associação de destino", verifique se o destino de construção apropriado está marcado.

Espero que isso ajude alguém lá fora.

Mike M. Lin
fonte
6

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.

Damo
fonte
Isso funcionou ao copiar e colar uma cena no editor do Storyboard.
Mizmor 25/04/19
5

No meu caso. Não havia pontos ausentes nos arquivos xib após a mesclagem.

Shift + Comando + K

resolveu meu problema. Limpei meu projeto e reconstruí-lo.

user123456
fonte
4

No meu caso, isso foi causado pela referência ao Nib errado:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];
wspruijt
fonte
1
Acontece comigo quando renomeio a classe do controlador de exibição e esqueço que o nome da ponta também precisa mudar. Como o nome da ponta é apenas uma sequência, não há erro do compilador.
kris
3

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.

Simétrico
fonte
Eu recebi esse erro novamente. Dessa vez, criei um novo controlador de exibição de tabela vazia com minha classe atribuída a ele, deixando o que não funcionava sozinho e movi o segue para ele. Isso funcionou. Eu então copiei lentamente todos os elementos na exibição até que falhou novamente. Desta vez, o problema acabou sendo que eu havia atribuído alguns "Atributos de Tempo de Execução Definidos pelo Usuário" para um seletor (eu estava pensando em usá-los para inicializar o seletor, para não precisar fazer isso no código, não faço ideia se isso é possível ) A remoção corrigiu o problema. Este erro é realmente horrível, espero que seja melhorado em uma versão futura!
Simétrico
3

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.

priya
fonte