Ich versuche ein UILabel
mit einem IBOutlet
in meiner Klasse erstellten zu verknüpfen .
Meine Anwendung stürzt mit dem folgenden Fehler ab.
Was bedeutet das?
Wie kann ich es reparieren?
*** Beenden der App aufgrund der nicht erfassten Ausnahme 'NSUnknownKeyException', Grund: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: Diese Klasse ist für den Schlüssel XXX nicht codierungskompatibel für Schlüsselwerte.'
ios
macos
cocoa
cocoa-touch
interface-builder
Guillaume Dubois
quelle
quelle
Antworten:
Ihr View Controller hat möglicherweise die falsche Klasse in Ihrer xib.
Ich habe dein Projekt heruntergeladen.
Der Fehler, den Sie erhalten, ist
Es wird dadurch verursacht, dass der
Second
View-ControllerMainWindow.xib
eine Klasse vonUIViewController
anstelle von hatSecondView
. Der Wechsel zur richtigen Klasse behebt das Problem.Übrigens ist es eine schlechte Praxis, Namen wie "string" in Objective-C zu haben. Es wird eine Laufzeit-Namenskollision eingeladen. Vermeiden Sie sie auch in einmaligen Übungs-Apps. Das Benennen von Kollisionen kann sehr schwer zu finden sein und Sie möchten keine Zeit 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 Verbindung zum ursprünglichen Controller auch nach dem Bearbeiten und erneuten Verknüpfen dieses Elements mit dem neuen Controller bei.
Ein weiterer möglicher Grund für diesen Fehler:
Schlechtes Outlet.
Sie haben einen Outlet-Namen in Ihrer Datei entweder entfernt oder umbenannt
.h
.Entfernen Sie es im Verbindungsinspektor
.xib
oder in der.storyboard
Datei.Ein weiterer möglicher Grund
(In meinem Fall) Erweiterung von UIView mit bindbaren Eigenschaften und Festlegen von Werten für diese bindbaren Eigenschaften (z. B. Schatten, Eckenradius usw.) Entfernen Sie dann diese Eigenschaften aus der UIView-Erweiterung (aus irgendeinem Grund), aber Folgendes
<userDefinedRuntimeAttributes>
blieb in xml (vonfoo.storyboard
):Lösung: Klicken Sie
foo.storyboard
mit der rechten Maustaste auf > Als Quellcode öffnen> Suche nach keyPath (dh shadowRadius)> Löschen Sie</userDefinedRuntimeAttributes>
das Problemquelle
Möglicherweise haben Sie eine schlechte Verbindung in Ihrem xib.
Ich habe diesen Fehler oft gehabt. Während die Antwort von TechZen in diesem Fall absolut richtig ist, besteht eine weitere häufige Ursache darin, dass Sie den Namen einer IBOutlet-Eigenschaft in Ihrer .h / .m-Datei ändern, die Sie bereits mit dem Eigentümer der Datei in der Schreibfeder verbunden haben.
Von Ihrer Feder:
Stellen Sie unter "Referenzieren von Outlets" sicher, dass Ihr Objekt noch nicht mit dem alten Eigenschaftsnamen verbunden ist. Wenn dies der Fall ist, klicken Sie auf das kleine "x", um die Referenz zu löschen und erneut zu erstellen.
Eine weitere häufige Ursache, wenn Sie Storyboard verwenden, ist, dass Ihr UIButton möglicherweise mehr als eine Zuweisung hat (Lösung ist fast dieselbe wie für Feder):
Sie werden sehen, dass dieser Schaltfläche mehr als eine Zuweisung / Referenz zugeordnet ist. Entfernen Sie eines der grauen Fenster "Main ..." mit dem kleinen "x":
quelle
Ich musste die App vom Simulator / iPhone löschen, um diesen Fehler zu beseitigen.
quelle
Ich hatte diesen Fehler, als ich versuchte, eine benutzerdefinierte ViewCell für eine Tabelle zu implementieren. Als ich View Controller für das XIB hervorgehoben und mit den Elementen in CellView verbunden habe, wurde der Fehler "Diese Klasse ist für den Schlüssel nicht mit der Schlüsselwertcodierung kompatibel" verursacht, nachdem ich diese gelöscht hatte, wurde der Fehler behoben.
Löschen Sie die Verbindungen im folgenden Bild.
Stellen Sie einfach sicher, dass Sie nur die Verbindungen mit der Tabellenansichtszelle haben. Um dies zu überprüfen, klicken Sie auf die Zelle der Tabellenansicht und suchen Sie in INSPECTOR nach Ihren Verbindungen.
quelle
Manchmal hat dies mit Ihrem "Vom Ziel erben" zu tun. Dieser Wert muss festgelegt werden. Bei Einzelziel-Apps können Sie einfach Von Ziel erben auswählen. Wenn Sie mehr als ein Ziel haben, wählen Sie das gewünschte Ziel aus.
quelle
Wenn es sich um eine iPhone-App handelt, nicht um eine universelle, stellen Sie sicher, dass das folgende Feld leer ist:
Ziele> Zusammenfassung> iPhone / iPod-Bereitstellungsinformationen> Hauptschnittstelle
Wenn Sie dort eine xib angeben, stürzt diese ab.
quelle
Dieser Fehler zeigt an, 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 Eigentümer der Datei, wenn ein Ausrufezeichen angezeigt wird, das Sie beheben müssen.
In der Abbildung unten sehen Sie, dass "aRemovedView" rechts ein Ausrufezeichen hat. Dies liegt daran, dass ich das IBOutlet-Ansichtsobjekt entfernt habe, während es bereits im IB verbunden war.
Dies führt zu folgendem Fehler: Beenden der App aufgrund der nicht erfassten Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist für den Schlüssel aRemovedView nicht codierungskompatibel für Schlüsselwerte .'
quelle
Ich hatte das gleiche Problem und obwohl die Antwort von TechZen in der Tat erstaunlich sein mag, fiel es mir schwer, mich auf meine Situation zu beziehen.
Schließlich habe ich das Problem behoben, indem ich das Etikett über den unter aufgeführten Controller verknüpft habe Objekte (im Bild unten hervorgehoben) und nicht über den Dateibesitzer verknüpft habe .
Hoffe das hilft.
quelle
In meinem Fall handelt es sich um einen Fehler im Storyboard-Quellcode. Führen Sie die folgenden Schritte aus:
<connections>
Zum Beispiel:
Wie Sie sehen, sind dies Verbindungen zwischen den Namen Ihrer Codevariablen und den XML-Tags des Storyboard-Layouts;)
quelle
Mein Fix war ähnlich wie bei Gerard Grundy. Beim Erstellen einer benutzerdefinierten UITableViewCell mit einer XIB habe ich den Namen der benutzerdefinierten Klasse fälschlicherweise auf den Eigentümer der Datei anstatt auf die UITableViewCell angewendet. Das Anwenden der Klasse auf die UITableViewCell auf der Zeichenfläche und das Verbinden meiner IBOutlet-Eigenschaften damit löste das Problem.
quelle
IBOutlet
einmal angeben , dieIBOutlet
Bezeichnung Ihres Ivar ist nicht erforderlich.UIViewController
? Irgendwann sollten Sie anrufen[SecondView initWithNibName:@"yourNibName" bundle:nil];
quelle
-initWithNibName
mit dem falschen Spitznamen angerufen habe .Dies passierte mir nur beim Debuggen auf einem Gerät (iPhone). Der iOS-Simulator funktionierte einwandfrei. Ein "Produkt-> Reinigen" von Xcode aus zu tun schien das Problem zu lösen, aber ich habe keine Ahnung warum.
quelle
Ich hatte genau die gleiche Fehlermeldung und danke (!!) an Kira von http://www.idev101.com. Ich konnte die Herausforderung lösen. Ich habe ihre Seite erst gefunden, nachdem ich all diese Threads gegoogelt und gestapelt hatte. Ich poste jetzt hier für das nächste, das zu StackOverFlow kommt und die gleiche Herausforderung hat, die ich hatte, da diese Person höchstwahrscheinlich über Google zu diesem Thread kommen wird.
Mir wurde klar, dass ich das falsch gemacht habe:
An Stelle von:
Wo
War der Name meiner Klasse auch bekannt als
Du musst
in Ihrer Implementierung (.m-Datei), in der Sie zB einen anderen UIViewController aufrufen möchten.
Es tut mir absolut nicht leid, wenn ich nur für Anfänger wie mich das Offensichtliche sage und möglicherweise Stimmen verlieren kann, da dies nicht genau mit der Frage zusammenhängt, aber ich habe gerade 4 (?!?) Stunden nach der Antwort auf diese Fehlermeldung gesucht . Wenn ich das 1 oder 2 Leuten ersparen kann, wäre das großartig :)
PS: Für diejenigen, die daran interessiert sind, wie der Code zum Laden des anderen UIViewControllers fortgesetzt wird:
quelle
Dies kann daran liegen, dass Sie das Steuerelement gezogen und einen Ausgang oder eine Aktion erstellt und vergessen haben, ihn zu löschen. Selbst wenn Sie den Code gelöscht haben oder wenn Sie genügend cmd + Z erstellt haben, müssen Sie im Verbindungsinspektor Ihres Storyboards nachsehen, ob die von Ihnen erstellte Aktion oder der von Ihnen erstellte Ausgang noch vorhanden ist oder nicht.
quelle
Wenn man sich die anderen Antworten ansieht, scheint es viele Dinge zu geben, die diesen Fehler verursachen können. Hier ist noch einer.
Wenn du
Dann erhalten Sie möglicherweise auch einen ähnlichen Fehler wie
Die Lösung besteht darin, die alte Eigenschaft zu löschen.
Öffnen Sie den Identitätsinspektor für Ihre Klasse, wählen Sie den Eigenschaftsnamen unter Benutzerdefinierte Laufzeitattribute aus und drücken Sie die Minus-Taste (-).
quelle
Dies passiert mir, als mein View Controller ursprünglich eine .xib-Datei hatte, jetzt aber programmgesteuert erstellt wird.
Obwohl ich die .xib-Datei aus diesem Projekt gelöscht habe. Das iPhone / iPad des Benutzers enthält möglicherweise eine .xib-Datei für diesen Viewcontroller.
Der Versuch, eine .xib-Datei zu laden, führt normalerweise zu folgendem Absturz:
Die Lösung beim programmgesteuerten Erstellen kann folgende sein:
quelle
Die Eigenschaft "Modul" von View Controller im Identitätsinspektor unterscheidet sich möglicherweise von Ihren Erwartungen. Stellen Sie außerdem sicher, dass Ihrer Zielliste neue Klassen hinzugefügt werden.
quelle
Ich hatte ein ähnliches Problem für ein Projekt mit zwei Zielen (mit eigenem MainWindow XIB). Das grundlegende Problem, das diesen Fehler für mich verursachte, war, dass die UIViewController-Klasse nicht in der Ressourcenliste des zweiten Projekts enthalten war. Der Interface Builder erlaubte mir, ihn in MainWindow.xib anzugeben, aber zur Laufzeit konnte das System die Klasse nicht finden.
Klicken Sie mit der Maustaste auf die betreffende UIViewController-Klasse und überprüfen Sie, ob sie auf der Registerkarte "Ziele" enthalten ist.
quelle
Nur um das hinzuzufügen, weil ich auch diesen Fehler bekommen habe. Das Durchgehen all dieser Antworten scheint sich am meisten auf die Arbeit mit der Benutzeroberfläche und dem Storyboard zu beziehen. Ich weiß, dass das Originalposter anscheinend mit der Benutzeroberfläche funktioniert hat, aber bei der Suche nach möglichen Gründen für diesen Fehler führen meistens alle Fragen auf diese Frage zurück, wobei die anderen als Duplikate geschlossen werden oder einfach Probleme beim Verbinden von Dingen in einem Storyboard haben füge meine Lösung hinzu.
Ich habe an der Codierung eines Webdienstes in Swift 2 gearbeitet. Ich hatte alle erforderlichen Proxy-Objekte und Stubs erstellt. Während ich das zurückgegebene XML durchlief, instanziierte ich dynamisch meine Objekte, die alle von ihnen stammten
NSObject
undsetValue:forKey
auf ihnen verwendet wurden. Jedes MalsetValue:forKey
, versucht wurde, eine Eigenschaft festzulegen, wurde dieser Fehler angezeigt.Ich hatte eine switch - Anweisung für jeden Typen , mit dem ich zu tun (zB
Bool?
,CShort?
,String?
) und für jeden XML - Knoten Ich ging durch und überprüft , was der Typ auf dem Objekt war und dann den Wert in diesem Typ konvertierte und versuchte , es zu setzen mitsetValue:forKey
.Schließlich fing ich an, all diese
setValue:forKey
Zeilen zu kommentieren und stellte fest, dass meindefault
Fall für switch-Anweisungen funktionierteString?
.Ich habe schließlich herausgefunden, dass Sie keine optionalen schnellen Typen verwenden können, es
setValue:forKey
sei denn, sie haben eine direkte Zuordnung zu einem Objective-C-Typ wieString?
oderNSNumber?
. Am Ende habe ich alleCShort?
Typen geändert,NSNumber?
da dies eine direkte Zuordnung hat. DennBool?
in meinem Fall war es für mich in Ordnung, nur die VerwendungBool
und initialisieren esfalse
. Andere haben diesen Luxus vielleicht nicht.Wie auch immer, was für Kopfschmerzen das hoffentlich jemand anderem hilft, der ein ähnliches Problem hat und immer wieder zu dieser Frage weitergeleitet wird und sich sagt: "Ich mache nichts in der Benutzeroberfläche !!".
Wenn Sie also noch einmal wiederholen, funktioniert die Schlüsselwertcodierung nicht mit Optionen. Unten habe ich irgendwo etwas gefunden, aber ich vergesse, wo ich mich bei jedem, der dies gepostet hat, entschuldige und würde es gutschreiben, wenn ich mich daran erinnere, wo ich das gefunden habe, aber es hat mein Leben gerettet:
quelle
"Diese Klasse ist für den Schlüssel nicht mit der Schlüsselwertcodierung kompatibel." Ich weiß, dass es etwas spät ist, aber meine Antwort ist anders, daher denke ich, dass sie veröffentlicht werden muss. Ich habe den zweiten Controller falsch gedrückt. Hier ist ein Beispiel
Falscher Weg, um den Controller zu drücken
Der richtige Weg
Ich habe keine Antwort wie oben gefunden, daher kann es jemandem helfen, der das gleiche Problem hat
quelle
Dies kann der Fall sein, wenn Sie auf eine Komponente aus der Xib-Schnittstelle verweisen, die Sie umbenannt oder gelöscht haben. Das erneute Referenzieren funktioniert bei mir.
quelle
Ich hatte gerade dieses Problem in meinem duplizierten Projekt und löste es, indem ich 2 Stellen überprüfte:
1- Stellen Sie sicher, dass Sie die .m-Datei in der Liste haben -> Projekt - Phasen
erstellen - Quellen kompilieren. 2- Gehen Sie danach zum Interface Builder (wahrscheinlich tritt nur bei IB ein Fehler auf) und heben Sie die Verknüpfung aller Eigenschaften, Beschriftungen und Bilder auf , etc ... Dann verknüpfe alle neu. Ich habe festgestellt, dass ich ein Attribut entfernt habe, aber es war immer noch in IB verknüpft.
Hoffe, es funktioniert für einige.
quelle
Ein weiteres "nicht konformes" Problem, das ich fand, war, als ich aus irgendeinem Grund zwei Kopien einer Klasse hatte.
Ich habe der falschen Kopie Schlüssel hinzugefügt. Interface Builder sah immer noch die Schlüssel und ließ mich mit ihnen verbinden, aber zur Laufzeit verwendete es die andere Kopie der Klasse, die die neuen Schlüssel nicht hatte.
Um herauszufinden, welche die "richtige" Kopie war, habe ich XCodes Cmd-Klick auf den Klassennamen an einer anderen Stelle verwendet, um zur richtigen Kopie zu springen. Dann habe ich die fehlerhaften nicht verwendeten Kopien entfernt (nachdem ich meine Änderungen von der nicht verwendeten Kopie übernommen hatte).
Moral der Geschichte: Doppelte Klassendateien sind schlecht.
quelle
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 durchzuführen, um zum nächsten Bildschirm zu springen. Hier was ich getan habe.
Prost,
quelle
Ich hatte das gleiche Symptom. Die Hauptursache war, dass die "Zielmitgliedschaft" für meine Quelldatei nicht auf das richtige Ziel festgelegt wurde. Ich gehe davon aus, dass meine Klasse nicht erstellt und in meine App aufgenommen wird.
Um es zu korrigieren:
Hoffe das hilft jemandem da draußen.
quelle
Wenn Sie eine benutzerdefinierte UIViewController-Unterklasse mit IBOutlets haben, die Probleme verursachen, waren die einzigen Schritte, die ich gefunden habe, um den Fehler tatsächlich zu beseitigen, folgende
.1 Ändern Sie die Klasse in UIViewController
.2 Trennen Sie alle Steckdosen (sie haben jetzt alle das gelbe Warndreieck) - es kann ausreichen, nur die problematischen Steckdosen zu trennen.
.3 Führen Sie alle Standardschritte aus - ↑ ⌘K, löschen Sie abgeleitete Daten (, Gebetsmatten, Sorgenperlen)
.4 Starten Sie die App - gehen Sie zur problematischen Szene.
.5 Beenden Sie die App und kehren Sie zu Interface Builder zurück. Ändern Sie die Klasse wieder in Ihren benutzerdefinierten Klassennamen.
.6 Schließen Sie Ihre Steckdosen wieder an.
Starten Sie die App und dies hat normalerweise die Probleme mit der Einhaltung der Schlüsselwerte behoben.
quelle
In meinem Fall. Ich hatte nach dem Zusammenführen keine fehlenden Steckdosen in xib-Dateien.
löste mein Problem. Ich habe mein Projekt gereinigt und wieder aufgebaut.
quelle
In meinem Fall wurde dies durch die Referenzierung der falschen Feder verursacht:
quelle
Ich habe diesen Fehler mit Storyboards erhalten. Die obige Lösung schien nicht das Problem zu sein, also löschte ich den View-Controller und fügte ihn wieder hinzu (und natürlich die Verbindung wieder herzustellen und die Klasse neu zuzuweisen), wodurch das Problem behoben wurde. Ich weiß nicht, was es wirklich war, aber ich hatte die zugehörige View-Controller-Klasse kurz vor Beginn umbenannt, also hatte das vielleicht etwas abgespritzt.
quelle
Ich habe das gleiche Problem. Ich habe den Simulator zurückgesetzt. Entfernen und Hinzufügen der Tastensteuerung. und machte schließlich eine saubere. :) Dank Stapelüberlauf. Einige, wie mein Code in Ordnung wurde und anfing zu funktionieren.
quelle