1279 Stimmen

Xcode - Wie behebt man den 'NSUnknownKeyException'-Fehler? Grund: ... Diese Klasse ist nicht schlüsselwertcodierfähig für den Schlüssel X"?

Ich versuche, ein UILabel mit einem IBOutlet zu verknüpfen, das in meiner Klasse erstellt wurde.

Meine Anwendung stürzt mit folgendem Fehler ab.

Was bedeutet das?

Wie kann ich das beheben?

*** App-Beendigung aufgrund von unbehandelter Ausnahme 'NSUnknownKeyException', Grund: '[ setValue:forUndefinedKey:]: Diese Klasse ist nicht schlüsselwertcodierfähig für den Schlüssel XXX.'

16voto

neoneye Punkte 47046

Dies geschieht mir, wenn mein Ansichts-Controller ursprünglich eine .xib-Datei hatte, aber jetzt programmgesteuert erstellt wird.

Auch wenn ich die .xib-Datei aus diesem Projekt gelöscht habe. Das iPhone/iPad des Benutzers kann eine .xib-Datei für diesen Ansichts-Controller enthalten.

Ein Versuch, eine .xib-Datei zu laden, führt normalerweise zu diesem Absturz:

Beenden der App aufgrund einer unbehandelten Ausnahme 'NSUnknownKeyException', Grund: '[ setValue:forUndefinedKey:]: Diese Klasse ist nicht schlüsselwert-kodierungskonform für den Schlüssel welcomeLabel.'

Die Lösung bei der programmgesteuerten Erstellung könnte wie folgt sein:

-(void)loadView {
    // Stellen Sie sicher, dass keine .xib-Datei für diesen Ansichts-Controller geladen wird
    self.view = [UIView new];
}

13voto

ercu Punkte 2535

"Module" Eigenschaft des View Controllers im Identity Inspector könnte anders sein als erwartet. Stellen Sie außerdem sicher, dass neue Klassen zu Ihrer Ziel Liste hinzugefügt werden.

12voto

David Carney Punkte 2200

Ich hatte ein ähnliches Problem für ein Projekt, das zwei Ziele hat (mit ihren eigenen MainWindow XIB). Das grundlegende Problem, das diesen Fehler für mich verursacht hat, war, dass die UIViewController-Klasse nicht in der Ressourcenliste des zweiten Projekts enthalten war. D.h. Interface Builder erlaubte es mir, es in MainWindow.xib anzugeben, aber zur Laufzeit konnte das System die Klasse nicht finden.

D.h. Klicken Sie auf die UIViewController-Klasse in Frage und überprüfen Sie, ob sie im Registerkarte 'Ziele' enthalten ist.

9voto

AtheistP3ace Punkte 9371

Nur um das hinzuzufügen, denn ich hatte auch diesen Fehler. Beim Durchgehen all dieser Antworten scheinen die meisten sich auf die Arbeit mit der Benutzeroberfläche und Storyboard zu beziehen. Ich weiß, dass der ursprüngliche Poster anscheinend mit der Benutzeroberfläche gearbeitet hat, aber bei der Suche nach möglichen Gründen für diesen Fehler führen die meisten Fragen meist zurück zu dieser Frage, während die anderen als Duplikate geschlossen werden oder einfach Probleme mit der Verbindung von Elementen in einem Storyboard haben, deshalb werde ich meine Lösung hinzufügen.

Ich habe an einem Webdienst in Swift 2 gearbeitet. Ich hatte alle benötigten Proxy-Objekte und Stümpfe erstellt. Als ich durch das zurückgegebene XML ging, habe ich dynamisch Objekte instanziiert, die alle von NSObject kamen und setValue:forKey auf ihnen verwendet. Jedes Mal, wenn setValue:forKey versuchte, eine Eigenschaft zu setzen, gab es diesen Fehler.

Ich hatte eine switch-Anweisung für jeden Typ, mit dem ich umging (zum Beispiel Bool?, CShort?, String?) und für jeden XML-Knoten ging ich durch und überprüfte, was der Typ des Objekts war, dann konvertierte ich den Wert zu diesem Typ und versuchte, ihn mit setValue:forKey zu setzen.

Schließlich begann ich, all diese setValue:forKey-Zeilen auszukommentieren und stellte fest, dass mein default-Fall der switch-Anweisung für String? funktionierte.

Schließlich habe ich herausgefunden, dass man keine optionalen Swift-Typen mit setValue:forKey verwenden kann, es sei denn, sie haben eine direkte Zuordnung zu einem Objective-C-Typ wie String? oder NSNumber?. Ich habe schließlich alle CShort?-Typen in NSNumber? geändert, da diese eine direkte Zuordnung haben. Für Bool? war es in meinem Fall in Ordnung, einfach Bool zu verwenden und es auf false zu initialisieren. Andere haben vielleicht nicht dieses Glück.

Wie auch immer, welch ein Kopfschmerz das war, also hoffentlich hilft das jemand anderem, der ein ähnliches Problem hat und immer wieder zu dieser Frage umgeleitet wird und sich sagt: "Ich mache nichts in der Benutzeroberfläche!".

Zum Abschluss noch einmal zur Verdeutlichung, Key-Value Coding funktioniert nicht mit Optionals. Hier ist etwas, das ich irgendwo gefunden habe, aber ich weiß nicht mehr wo, also an die Person, die das gepostet hat, es tut mir leid und ich würde Kredit geben, wenn ich mich erinnern würde, wo ich das gefunden habe, aber es hat mir das Leben gerettet:

Sie können KVC nicht auf eine optionale Int-Eigenschaft anwenden, da KVC Cocoa/ Objective-C ist und Objective-C eine optionale Int nicht sehen kann - sie ist nicht mit Objective-C verbunden. Objective-C kann nur Typen sehen, die mit Objective-C verbunden sind:

Klassen, die von NSObject abgeleitet sind

Klassen, die mit @objc freigegeben sind

Swift-Strukturen, die verbunden sind

9voto

Emy Punkte 346

"Diese Klasse ist nicht schlüsselwert-Codierungskonform für den Schlüssel" Ich weiß, es ist ein wenig spät, aber meine Antwort ist anders, daher denke ich, dass sie gepostet werden sollte. Ich habe den zweiten Controller auf die falsche Weise eingefügt. Hier ist ein Beispiel

Falsche Art und Weise, den Controller einzufügen

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

Richtige Art und Weise

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

Ich habe keine Antwort wie die oben genannte gefunden, daher könnte es jemandem helfen, der dasselbe Problem hat

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X