ios - developer - xcode tutorial




Was bedeutet das? "'NSUnknownKeyException', Grund:... diese Klasse ist für den Schlüssel X nicht Schlüsselcodierung-kompatibel" (20)

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

Meine Anwendung stürzt mit dem folgenden Fehler ab. Was bedeutet das? Wie kann ich es reparieren?

*** Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSUnknownKeyException', Grund: '[<UIViewController 0x6e36ae0> setValue: fürUndefinedKey:]: Diese Klasse ist für den Schlüssel XXX nicht Schlüsselcodierkonform.'


Ihr View-Controller hat möglicherweise die falsche Klasse in Ihrem Xib.

Ich habe dein Projekt heruntergeladen.

Der Fehler, den Sie bekommen, ist

'NSUnknownKeyException', Grund: '[<UIViewController 0x3927310> setValue: forUndefinedKey:]: Diese Klasse ist für die Schlüsselzeichenfolge nicht schlüsselcodierfähig.'

Es wird vom Second Ansichtscontroller in MainWindow.xib mit einer Klasse von UIViewController anstelle von SecondView . Der Wechsel zur richtigen Klasse behebt das Problem.

Übrigens ist es in Objective-C schlecht, Namen wie "string" zu haben. Es lädt eine Laufzeitbenennungskollision ein. Vermeide sie auch in einmaligen Apps. Kollisionen zu benennen, kann sehr schwer zu finden sein und Sie möchten die Zeit nicht verschwenden.

Ein weiterer möglicher Grund für diesen Fehler: Beim Kopieren und Einfügen von Elementen von einem Controller in einen anderen behält Xcode diese Verknüpfung irgendwie zum ursprünglichen Controller bei, selbst nach dem Bearbeiten und erneuten Verknüpfen dieses Elements mit dem neuen Controller.


Möglicherweise haben Sie eine schlechte Verbindung in Ihrer Xib.

Ich habe diesen Fehler viele Male gehabt. Während die Antwort von TechZen in diesem Fall absolut richtig ist, ist eine andere häufige Ursache, wenn Sie den Namen einer IBOutlet-Eigenschaft in Ihrer .h / .m, die Sie bereits mit dem Eigentümer der Datei in der Spitze verbunden haben, ändern.

Von deiner Feder:

  1. Wählen Sie das Objekt in IB und gehen Sie zum "Inspektor für Verbindungen".
  2. Stellen Sie unter "Referenzieren von Outlets" sicher, dass Ihr Objekt nicht mit dem alten Eigenschaftsnamen verbunden ist. Wenn dies der Fall ist, klicken Sie auf das kleine "x", um den Verweis zu löschen und erneut zu erstellen.

Eine weitere häufige Ursache, wenn Sie Storyboard verwenden, könnte Ihr UIButton mehr als eine Zuweisung haben (Lösung ist fast die gleiche wie für Nib):

  1. Öffne dein Storyboard und klicke mit der rechten Maustaste auf die UIB-Taste
  2. Sie werden feststellen, dass dieser Schaltfläche mehr als eine Zuweisung / Referenz zugeordnet ist. Entferne eines der grauen "Main ..." - Fenster mit dem kleinen "x":


"Diese Klasse ist nicht schlüsselcodefähig für den Schlüssel" Ich weiß, es ist ein bisschen spät, aber meine Antwort ist anders, also denke ich, dass es gepostet werden muss, ich habe den zweiten Controller falsch herum geschoben. Hier ist ein Beispiel

Falsche Art, Controller zu drücken

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

Der richtige Weg

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

Ich habe keine Antwort wie oben gefunden gefunden, also kann es jemandem helfen, der dasselbe Problem hat


Beim Blick auf die anderen Antworten scheint es, dass es viele Dinge gibt, die diesen Fehler verursachen können. Hier ist noch eins.

Wenn du

  • habe eine benutzerdefinierte Ansicht
  • eine @IBInspectable-Eigenschaft hinzugefügt
  • und dann später gelöscht

Dann können Sie auch einen ähnlichen Fehler erhalten

Fehler beim Festlegen (xxx) der benutzerdefinierten inspizierten Eigenschaft auf [Ihre benutzerdefinierte Ansicht] ...: Diese Klasse ist für den Schlüssel [xxx] nicht Schlüsselcodierkonform.

Die Lösung besteht darin, die alte Eigenschaft zu löschen.

Öffnen Sie den Identity Inspector für Ihre Klasse, wählen Sie unter Benutzerdefinierte Laufzeitattribute den Namen der Eigenschaft und drücken Sie die Minus-Taste (-).


Die Eigenschaft "Module" von View Controller im Identity Inspector unterscheidet sich möglicherweise von Ihren Erwartungen. Stellen Sie außerdem sicher, dass neue Klassen zu Ihrer Zielliste hinzugefügt werden.


Dies könnte der Fall sein, wenn Sie eine Komponente von der Xib-Schnittstelle referenzieren, die Sie umbenannt oder gelöscht haben. Re-Referenzierung funktioniert für mich.


Dieser Fehler ist etwas anderes!

Hier ist, wie ich es behoben habe. Ich benutze xcode Version 6.1.1 und benutze swift. Ich habe diesen Fehler jedes Mal erhalten, wenn meine App versucht hat, einen Übergang zum nächsten Bildschirm auszuführen. Hier, was ich getan habe.

  1. Überprüft, dass die Schaltfläche mit der richtigen Aktion verbunden war. (Dies war nicht das Problem, aber immer noch gut zu überprüfen)
  2. Stellen Sie sicher, dass auf der Schaltfläche keine zusätzlichen Aktionen oder Ausgänge vorhanden sind, die Sie versehentlich erstellt haben. (Das war nicht das Problem, aber immer noch gut zu überprüfen)
  3. Überprüfen Sie die Protokolle und stellen Sie sicher, dass alle Schaltflächen in der NEXT SCREEN die richtigen Aktionen haben, und wenn es irgendwelche Übergänge gibt, stellen Sie sicher, dass sie eine eindeutige Kennung haben. (Das war das Problem)
    • Eines der Segmente hatte keine eindeutige Kennung
    • Eine der Tasten hatte eine Aktion und zwei Ausgänge, die ich versehentlich erstellt habe.
    • Löschen Sie alle zusätzlichen Anschlüsse und stellen Sie sicher, dass die Übergänge zum nächsten Bildschirm eindeutige Kennungen haben.

Prost,


Dieser Fehler weist darauf hin, dass ein bereits verbundenes Interface Builder- Objekt in der Quelle seines Besitzers (Eigentümer der Datei) entfernt / umbenannt wurde .

Klicken Sie im Interface Builder bei gedrückter Ctrl-Taste auf den Besitzer der Datei, wenn Sie ein Ausrufezeichen sehen, das Sie beheben müssen.

Im Bild unten sehen Sie, dass "aRemovedView" rechts ein Ausrufezeichen hat, weil ich das IBOutlet-Ansichtsobjekt entfernt habe, während es bereits im IB verbunden war.

Das gibt den folgenden Fehler: Beenden von App wegen nicht abgefangener Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist für den Schlüssel aRemovedView nicht Schlüsselcodierung-kompatibel .'


Es kann von der Tatsache herrühren, dass Sie die Kontrolle gezogen und eine Steckdose oder Aktion erstellt haben und vergessen haben, sie zu löschen. Selbst wenn Sie den Code gelöscht haben oder wenn Sie genug cmd + Z erstellt haben, müssen Sie in den Verbindungsinspektor Ihres Storyboards gehen und prüfen, ob die von Ihnen erstellte Aktion oder der Ausgang noch vorhanden ist oder nicht.


Ich habe das gleiche Problem. Ich habe den Simulator zurückgesetzt. Schaltflächensteuerung entfernen und hinzufügen und machte schließlich eine sauber. :) Dank Stapelüberlauf. Einige, wie mein Code in Ordnung ging und anfing zu arbeiten.


Ich hatte das gleiche Problem und während TechZens Antwort in der Tat erstaunlich ist, fand ich es schwierig, mich auf meine Situation zu beziehen.

Schließlich habe ich das Problem gelöst, indem ich das Etikett über den Controller, der unter Objekte (im Bild unten dargestellt) aufgeführt ist, und nicht über den Dateibesitzer verknüpfe .

Hoffe das hilft.


Ich hatte das gleiche Symptom. Die Ursache war, dass die "Zielmitgliedschaft" für meine Quelldatei nicht auf das korrekte Ziel festgelegt wurde. Ich nehme an, dass meine Klasse nicht gebaut und in meiner App enthalten ist.

Um es zu korrigieren:

  1. Markieren Sie Ihre .m-Datei.
  2. Wählen Sie im rechten Bereich den Dateiinspektor.
  3. Vergewissern Sie sich im Abschnitt "Zielmitgliedschaft", dass das entsprechende Erstellungsziel aktiviert ist.

Hoffe, das hilft jemandem da draußen.


Ich hatte ein ähnliches Problem für ein Projekt, das zwei Ziele (mit ihrer eigenen MainWindow XIB) hat. 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. Mit dem Interface Builder konnte ich es in MainWindow.xib angeben, aber zur Laufzeit konnte das System die Klasse nicht finden.

Klicken Sie mit der rechten Maustaste auf die entsprechende UIViewController-Klasse und überprüfen Sie, ob sie in der Registerkarte "Ziele" enthalten ist.


Ich hatte genau die gleiche Fehlermeldung und Danke (!!) an Kira von http://www.idev101.com konnte ich die Herausforderung lösen. Ich habe ihre Seite nur gefunden, nachdem ich über all diese Threads gegoogelt und gestapelt habe. Ich poste jetzt hier für den nächsten, der zu kommt und hat die gleiche Herausforderung, die ich hatte, seit diese Person höchstwahrscheinlich zu diesem Thread über Google kommt.

Mir wurde klar, dass ich das falsch gemacht habe:

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

An Stelle von:

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

Woher

DeviceViewController

War der Name meiner Klasse auch bekannt als

DeviceViewController.h 
DeviceViewController.m

Du wirst es müssen

"import DeviceViewController.h"

in Ihrer Implementierung (.m Datei), wo Sie zB einen anderen UIViewController aufrufen möchten.

Es tut mir absolut nicht leid, wenn ich nur das Offensichtliche für Anfänger wie mich sage und vielleicht Stimmen abbekomme, da dies nicht genau mit der Frage zusammenhängt, aber ich gerade 4 (?!?) Stunden gerade nach der Antwort auf diese Fehlermeldung gesucht habe . Wenn ich das auf 1 oder 2 Leute ersparen kann, wäre das toll :)

PS: Für diejenigen, die daran interessiert sind, wie der Code zum Laden der anderen UIViewController weiterläuft:

    [self presentViewController:deviceViewController animated:YES completion:nil];

Ich musste die App vom Simulator / iPhone löschen, um diesen Fehler loszuwerden.


In meinem Fall war es ein Fehler im Storyboard-Quellcode, folge diesen Schritten:

  1. Öffne zuerst dein Storyboard als Quellcode
  2. suche nach <connections>
  3. Entfernen Sie unerwünschte Verbindungen

Beispielsweise:

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

Wie Sie sehen, sind dies die Verbindungen zwischen den Namen Ihrer Codevariablen und den XML-Tags des Storyboardlayouts.


In meinem Fall. Ich habe keine Anschlüsse in XIB-Dateien nach dem Zusammenführen vermisst.

Umschalt + Befehl + K

löste mein Problem. Ich habe mein Projekt gereinigt und neu aufgebaut.


Manchmal hängt das mit Ihrem "Vom Ziel übernehmen" zusammen. Dieser Wert muss festgelegt werden. Bei einzelnen Ziel-Apps können Sie einfach "Von Ziel übernehmen" auswählen. Wenn Sie mehr als ein Ziel haben, wählen Sie das gewünschte Ziel.


Wenn Sie eine benutzerdefinierte UIViewController-Unterklasse mit IBOutlets haben, die Probleme verursachen, waren die einzigen Schritte, die ich fand, um den Fehler tatsächlich loszuwerden

.1 Ändern Sie die Klasse in UIViewController

.2 Trennen Sie alle Steckdosen (sie haben jetzt alle das gelbe Warndreieck) - es kann ausreichen, nur die problematische (n) Steckdose (n) zu trennen.

.3 Alle Standardschritte ausführen - ↑ ⌘K, Abgeleitete Daten löschen (, Gebetsmatten, Sorgenperlen)

.4 Starten Sie die App - gehen Sie zur problematischen Szene.

.5 Töten Sie die App, gehen Sie zurück zum Interface Builder, und ändern Sie die Klasse wieder in Ihren benutzerdefinierten Klassennamen.

.6 Schließen Sie Ihre Steckdosen wieder an.

Starten Sie die App & dies wird normalerweise die Schlüssel-Wert-Compliance-Probleme beseitigt haben.


Wenn es sich um eine reine iPhone-App handelt, stellen Sie sicher, dass das folgende Feld leer ist:

Ziele> Zusammenfassung> iPhone / iPod-Bereitstellungsinformationen> Hauptoberfläche

Wenn Sie dort eine Xib angeben, stürzt es ab.







interface-builder