Aplicativo para iPhone travando com NSUnknownKeyException setValue:forUndefinedKey:[duplicado]
-
09-06-2019 - |
Pergunta
Essa pergunta já tem resposta aqui:
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.
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.