L'app per iPhone si blocca con NSUnknownKeyException setValue:forUnfineKey:[duplicare]

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

  •  09-06-2019
  •  | 
  •  

Domanda

Sto scrivendo la mia prima app per iPhone, quindi non sono riuscito a capire molto in termini di debug.Essenzialmente la mia app visualizza un'immagine e quando viene toccata riproduce un breve suono.Durante la compilazione e la creazione del progetto in XCode, tutto viene creato correttamente, ma quando l'app viene eseguita nel simulatore iPhone, si blocca.

Ottengo il seguente errore:

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 ecco l'immagine che sto usando per lo sfondo.

Non sono sicuro del significato di NSUnknownKeyException o del motivo per cui la classe non è conforme alla codifica del valore chiave per la chiave.

È stato utile?

Soluzione

(Questo non è proprio specifico per iPhone: la stessa cosa accadrà nel normale Cocoa).

NSUnknownKeyException è un errore comune durante l'utilizzo Codifica valore-chiave per accedere a una chiave che l'oggetto non possiede.

È possibile accedere direttamente alle proprietà della maggior parte degli oggetti Cocoa:

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

Oppure tramite la codifica del valore-chiave:

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

Otterrei una NSUnknownKeyException se utilizzassi la seguente riga:

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

perché NSString non ha una proprietà (chiave) chiamata "purpleMonkeyDishwasher".

Qualcosa nel tuo codice sta tentando di impostare un valore per la chiave "kramerImage" su un UIView, che (apparentemente) non supporta quella chiave.Se utilizzi Interface Builder, potrebbe esserci qualcosa nel tuo pennino.

Scopri dove viene utilizzato "kramerImage" e prova a rintracciarlo da lì.

Altri suggerimenti

Inoltre, quando rinomini una vista, non dimenticare di eliminare il riferimento al Proprietario del file.Potrebbe anche generare questo errore.

Eccone uno in cui riceverai questo errore e come risolverlo.Lo ricevevo durante il caricamento di un pennino che aveva solo un TableViewCell personalizzato.Ho usato IB per creare un xib che avesse solo il proprietario del file, il primo risponditore e TableViewCell.TableViewCell aveva solo 4 UILabels che corrispondevano a una classe con 4 UILabels IBOutlet chiamata rootCell.Ho cambiato la classe di TableViewCell in rootCell.Ha funzionato bene fino a quando non ho apportato un paio di modifiche e all'improvviso ho ottenuto il setValue:forUnfineKey:quando stavo semplicemente istanziando la classe dopo averla caricata da un pennino:

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

    cell = [nib objectAtIndex:0];

Non è riuscito alla prima riga, quando il pennino stava tentando di caricarsi.Dopo un po', ho notato che stava cercando di far corrispondere le etichette IBOutlet al controller root, NON alla classe rootCell!Questo è stato il mio suggerimento.Quello che ho fatto di sbagliato è stato cambiare inavvertitamente il proprietario del file nella classe rootCell.Quando l'ho cambiato di nuovo in NSObject, non ha provato a corrispondere al delegato (rootController) durante il caricamento.Quindi, se stai facendo quanto sopra, rendi File's Owner un NSObject, ma rendi UITableCell la classe desiderata.

Ho avuto questa situazione e si scopre che anche dopo aver trovato tutte le istanze della variabile ed averle eliminate, la mia app si è bloccata ancora.Ecco cosa è successo...Ho creato un'altra istanza di una variabile da un campo di testo dal mio XIB nel mio viewController.h ma mi sono reso conto che non ne avevo più bisogno e l'ho cancellato.Si scopre che il mio programma l'ha visto e ha continuato a provare a usarlo nel programma, quindi in futuro se questo accade altrove basta andare nel tuo XIB, fare clic con il pulsante destro del mouse sul pulsante o sul campo di testo ecc. ed eliminare eventuali variabili extra inutilizzate.

Ho avuto lo stesso problema oggi.Non avevo specificato la classe corretta per il controller di visualizzazione nel controller di navigazione.Ciò accadrà spesso se non specifichi la classe corretta per le tue visualizzazioni in Interface Builder.

Riceverai anche problemi di selezione non valida.Controlla sempre le classi e le connessioni di Interface Builder!

Ecco come ho risolto il mio, nel generatore di interfacce fai clic con il pulsante destro del mouse sul controller di visualizzazione, dovrebbe essere presente un punto esclamativo sulla presa o sul metodo di azione mancante.Trova e rimuovi tutti i riferimenti e questo lo ha risolto.

Ciò è accaduto perché ho eliminato il metodo di azione nel file .m.

Sembra che tu stia facendo

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

Quindi, dopo aver sintetizzato la visualizzazione dell'immagine, quando apri "MyFirstIphoneAppViewController.xib" in Interface Builder, stai prendendo una visualizzazione dell'immagine da Strumento (menu)/Libreria che collega quella presa a "InitialkramerImage" dal proprietario del file di "MyFirstIphoneAppViewController.xib" .Quindi hai salvato il progetto.Ma dopo potresti cambiare il nome della variabile outlet "InitialkramerImage" in "kramerImage".Quindi, dopo aver fatto questo

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

e salvando il progetto quando lo esegui, non esiste l'outlet di "InitialkramerImage" in "MyFirstIphoneAppViewController.xib".Pertanto, quando esegui il progetto non ci sarà alcun riferimento a sbocco da Imageview a "kramerImage" e

"Per visualizzare la vista, UiviewController proverà a trovare lo sbocco su" InizialKramerImage "che non è esistente."

Quindi, genererà la "NSUnknownKeyException".

È possibile controllare l'uscita mancante aprendo il file NIB (.xib), quindi facendo clic con il pulsante destro del mouse sul "Proprietario dei file" di quello.

Se hai creato questo codice da qualche altra parte e disponi di un file zip/compresso, prova a estrarlo di nuovo.Potrebbe funzionare, non so perché, ma sento che è un problema di estrazione.

oppure puoi provare a cambiare IBOutlet in kramerImage e associarlo nuovamente in NIB.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top