Aplicativo para iPhone travando com NSUnknownKeyException setValue:forUndefinedKey:[duplicado]

StackOverflow https://stackoverflow.com/questions/46220

  •  09-06-2019
  •  | 
  •  

Pergunta

Estou escrevendo meu primeiro aplicativo para iPhone, então ainda não consegui descobrir muito sobre depuração.Essencialmente, meu aplicativo exibe uma imagem e, quando tocado, reproduz um som curto.Ao compilar e construir o projeto no XCode, tudo é compilado com sucesso, mas quando o aplicativo é executado no simulador do iPhone, ele trava.

Estou tendo o erro a seguir:

Application Specific Information:
iPhone Simulator 1.0 (70), iPhone OS 2.0 (5A331)
*** Terminating app due to uncaught exception 'NSUnknownKeyException', 
reason: '[<UIView 0x34efd0> setValue:forUndefinedKey:]: this class is not key value 
coding-compliant for the key kramerImage.'

kramerImage aqui está a imagem que estou usando como plano de fundo.

Não tenho certeza do que significa NSUnknownKeyException ou por que a classe não é compatível com a codificação do valor-chave para a chave.

Foi útil?

Solução

(Isso não é específico do iPhone - a mesma coisa acontecerá no Cocoa normal).

NSUnknownKeyException é um erro comum ao usar Codificação de valor-chave para acessar uma chave que o objeto não possui.

As propriedades da maioria dos objetos Cocoa podem ser acessadas diretamente:

[@"hello world" length]    // Objective-C 1.0
@"hello world".length      // Objective-C 2.0

Ou via codificação de valor-chave:

[@"hello world" valueForKey:@"length"]

Eu receberia uma NSUnknownKeyException se usasse a seguinte linha:

[@"hello world" valueForKey:@"purpleMonkeyDishwasher"]

porque NSString não possui uma propriedade (chave) chamada 'purpleMonkeyDishwasher'.

Algo no seu código está tentando definir um valor para a chave 'kramerImage' em um UIView, que (aparentemente) não suporta essa chave.Se você estiver usando o Interface Builder, pode ser algo na sua ponta.

Descubra onde 'kramerImage' está sendo usado e tente rastreá-lo a partir daí.

Outras dicas

Além disso, ao renomear uma visualização, não se esqueça de excluir a referência no Proprietário do Arquivo.Também pode gerar esse erro.

Aqui está onde você receberá esse erro - e como corrigi-lo.Eu estava entendendo ao carregar uma ponta que tinha apenas um TableViewCell personalizado.Usei o IB para construir um xib que tinha apenas o proprietário do arquivo, o primeiro respondente e o TableViewCell.O TableViewCell tinha apenas 4 UILabels que correspondiam a uma classe com 4 UILabels IBOutlet chamada rootCell.Mudei a classe do TableViewCell para rootCell.Funcionou bem até que fiz algumas alterações e de repente eu estava recebendo o setValue:forUndefinedKey:quando eu estava instanciando a classe depois de carregá-la de uma ponta:

    NSArray * nib = [[NSBundle mainBundle] loadNibNamed:@"rootCell-iPad" owner:self options:nil];

    cell = [nib objectAtIndex:0];

Falha na primeira linha, quando a ponta estava tentando carregar.Depois de um tempo, percebi que ele estava tentando combinar os rótulos IBOutlet com o controlador raiz, NÃO com a classe rootCell!Essa foi a minha dica.O que fiz de errado foi alterar inadvertidamente o proprietário do arquivo para a classe rootCell.Quando mudei de volta para NSObject, ele não tentou corresponder ao delegado (rootController) ao carregar.Portanto, se você estiver fazendo o acima, torne o proprietário do arquivo um NSObject, mas torne UITableCell a classe desejada.

Eu tive essa situação e mesmo depois de encontrar todas as instâncias da variável e excluí-las, meu aplicativo ainda travou.Aqui está o que aconteceu...Criei outra instância de uma variável de um campo de texto do meu XIB para o meu viewController.h, mas percebi que não precisava mais dele e o excluí.Acontece que meu programa viu isso e continuou tentando usá-lo no programa, então, no futuro, se isso acontecer em qualquer outro lugar, basta acessar seu XIB, clicar com o botão direito do mouse no botão ou campo de texto, etc., e excluir quaisquer variáveis ​​extras não utilizadas.

Eu tive esse mesmo problema hoje.Eu não tinha a classe correta especificada para o View Controller no meu Navigation Controller.Isso acontecerá frequentemente se você não especificar a classe correta para suas visualizações no Interface Builder.

Você também terá problemas de seletor inválido.Sempre verifique suas classes e conexões do Interface Builder!

Foi assim que resolvi o meu, no construtor Interface, clique com o botão direito do mouse no View Controller, deve haver um ponto de exclamação na saída ou método de ação ausente.Encontre e remova todas as referências e isso resolveu.

Isso aconteceu porque excluí o método de ação do arquivo .m.

Parece que você está fazendo

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *InitialkramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *InitialkramerImage;

Então, depois de sintetizar essa visualização de imagem, ao abrir "MyFirstIphoneAppViewController.xib" no Interface Builder, você está obtendo uma visualização de imagem da ferramenta (menu)/biblioteca, vinculando essa saída ao 'InitialkramerImage' do proprietário dos arquivos de "MyFirstIphoneAppViewController.xib" .Então você salvou o projeto.Mas depois disso você pode alterar o nome da variável de saída "InitialkramerImage" para "kramerImage".Então, depois de fazer isso

@interface MyFirstIphoneAppViewController : UIViewController<> {
    UIImageView *kramerImage;
}
@property(nonatomic,retain) IBOutlet UIImageView *kramerImage;

e salvando o projeto ao executá-lo, não existe a saída de "InitialkramerImage" no "MyFirstIphoneAppViewController.xib".Portanto, quando você executar o projeto, não haverá referência de saída do Imageview para o 'kramerImage' e

"Para exibir a visualização, o UIViewController tentará encontrar a saída para" InitialkRameImage ", que não existe".

Portanto, será lançada a "NSUnknownKeyException".

Você pode verificar a saída ausente abrindo o arquivo NIB (.xib) e clicando com o botão direito do mouse no 'proprietário dos arquivos' disso.

Se você fez esse código em outro lugar e tinha um arquivo zip/compactado, tente extraí-lo novamente.Pode funcionar, não sei por que, mas sinto que é um problema de extração.

ou você pode tentar alterar o IBOutlet para kramerImage e vinculá-lo novamente no NIB.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top