Xcode - Wie behebt man 'NSUnknownKeyException', Grund:… ​​diese Klasse ist für den Schlüssel X "-Fehler nicht mit der Schlüsselwertcodierung kompatibel?


1172

Ich versuche ein UILabelmit einem IBOutletin 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.'


11
Pedrotorres ist richtig. Ja das ist richtig. Wenn Sie eine UITableViewCell ausführen, denken Sie in IB daran, den Eigentümer der Datei für NSObject und die UITableViewCell'Class für die von Ihnen definierte .h-Klasse festzulegen.
Giuseppe

3
Wenn Sie auf ein solches Problem stoßen und der betreffende Schlüssel eher eine Aktion als eine Steckdose ist, haben Sie höchstwahrscheinlich eine Steckdose, die fälschlicherweise auf Ihren Aktionsfunktionsnamen anstelle Ihres Ausgangsvariablennamens verweist .
Alex Yursha

2
Sie sollten beachten, dass der Name des Schlüssels in der Fehlermeldung (das OP nennt ihn 'XXXX') der Name ist, den Sie etwas in Ihrer NIB-Datei gegeben haben. Das sollte helfen, Ihre Suche einzugrenzen.
Kris

Ich habe rdar: // 22105925 eingereicht und Apple gebeten, diese Fehler beim Erstellen deutlicher zu machen. :)
jtbandes

wie man das Problem SOFORT löst! stackoverflow.com/a/13812660/294884 fantastischer Tipp
Fattie

Antworten:


980

Ihr View Controller hat möglicherweise die falsche Klasse in Ihrer xib.

Ich habe dein Projekt heruntergeladen.

Der Fehler, den Sie erhalten, ist

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

Es wird dadurch verursacht, dass der SecondView-Controller MainWindow.xibeine Klasse von UIViewControlleranstelle 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 .xiboder in der .storyboardDatei.

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 (von foo.storyboard):

<userDefinedRuntimeAttributes>
  <userDefinedRuntimeAttribute type="color" keyPath="shadowColor">
      <color key="value" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowOpacity">
      <real key="value" value="50"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="point" keyPath="shadowOffset">
      <point key="value" x="5" y="5"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="shadowRadius">
      <real key="value" value="16"/>
  </userDefinedRuntimeAttribute>
  <userDefinedRuntimeAttribute type="number" keyPath="borderWidthValue">
      <real key="value" value="0.0"/>
  </userDefinedRuntimeAttribute>
</userDefinedRuntimeAttributes>

Lösung: Klicken Sie foo.storyboardmit der rechten Maustaste auf > Als Quellcode öffnen> Suche nach keyPath (dh shadowRadius)> Löschen Sie </userDefinedRuntimeAttributes>das Problem


9
Vergessen Sie auch nicht, den "Ansichts" -Ausgang der Schreibfeder mit dem Ansichtsausgang des Dateibesitzers zu verbinden (Der Ansichtsausgang Ihrer benutzerdefinierten Klasse, der von UIViewController geerbt wurde). Dies kann durch Ziehen von "Dateibesitzer" unter "Platzhalter" zu "Ansicht" unter "Objekte" und Auswählen des Ansichtsausgangs erfolgen.
Nirma

1
Ich habe sichergestellt, dass alle Klassen bereits festgelegt sind, aber die NSUnknownKeyException kommt immer noch heraus :(
Zennichimaro

1
Ich verwende nicht einmal Interface Builder und erhalte immer noch diesen Fehler. Irgendeine Idee, was los ist?
Sudo

12
Keine Ursache. Das lag an zwei Dingen: Xcode griff immer noch auf mein Haupt-Storyboard zu, obwohl es aus dem Projekt entfernt wurde und der Simulator es zwischengespeichert hatte. Ich empfehle dringend, Storyboards oder NIBs zu verwenden - sie sind lächerlich problematisch.
Sudo

5
@ Josh Lol. Jedes Mal, wenn ich die Motivation aufbaue, eine native App in xcode zu erstellen, verbringe ich einen Tag damit, herauszufinden, wie ich etwas tun kann. Ich bin ac # dev, also habe ich mir in letzter Zeit Angebote von Xamarin und Telerik (Nativescript) angesehen.
Der Muffin-Mann

1524

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:

  1. Wählen Sie das Objekt in IB aus und gehen Sie zum 'Verbindungsinspektor'.
  2. 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.

    Geben Sie hier die Bildbeschreibung ein

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

  1. Öffnen Sie Ihr Storyboard und klicken Sie mit der rechten Maustaste auf den UIButton
  2. 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":

    Beispiel 2


1
Vielen Dank! In meinem Fall hatte ich zwei Steckdosen für dieselbe Ansicht, und das Entfernen der alten und das Anschließen der Ansicht an die neue beendete die Ausnahme.
Mark Patterson

meins wurde zweimal dupliziert. Nachdem ich eine Pro-Version (von einer Lite-Version) per Drag & Drop entfernt hatte, begann ich, die einzelnen Verbindungen zu trennen, da ich dachte, dass sie an den Verbindungen im anderen Projekt hängen. Als ich auf das Duplikat stieß und 3 Klicks brauchte, um die Trennung vorzunehmen, wünschte ich mir aufrichtig, ich hätte das 3 Tage zuvor getan. Na ja - so ist das Leben eines Entwicklers.
Aremvee

Ich hatte das Problem, dass UIButton mehr als eine Zuordnung hatte. Dies löste mein Problem.
mythicalcoder

Ich hatte auch dieses Problem. Vergessen Sie nicht, die Steckdosenverbindungen in bestimmten Ansichten anstatt nur in Übersichten zu überprüfen. In meinem Fall zeigten die Übersichten nicht die falschen Verbindungen = /
Augusto Carmo

Ich hatte einen ähnlichen Fehler, bei dem ich einen Button-Ausgang mit einer falschen ViewController-Swift-Datei verband, deren Seite noch nicht über die GUI erstellt worden wäre
brw59

114

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


1
+1 das hat es für mich behoben. Ich habe einen Code aufgeräumt, der IB verwendet hat. Wenn ich eine Schaltfläche aus dem Code löschte, trat der Fehler immer wieder auf, auch wenn in den NIB-Dateien überhaupt nicht auf diese Schaltfläche verwiesen wurde (zumindest das konnte ich sehen).
Sonntag Montag,

2
Ich finde, dass dies notwendig ist, wenn Sie zwei Anwendungen debuggen, die zufällig denselben Namen haben.
Anton

Ja, es scheint, dass etwas aus dem XIB im Simulator zwischengespeichert ist. Dies ist ein Problem, wenn Sie Upgrades testen, da Sie die alte App eigentlich nicht löschen müssen.
Carlos P

Ich hatte dieses Problem beim Löschen meiner XIB-Datei. Dies hat das Problem behoben.
Balboa

4
Wenn das Löschen der App nicht funktioniert, löschen Sie den Ordner XCode DerivedData. Dies kann eine falsche xib-Datei zwischenspeichern. Öffnen Sie XCode -> Einstellungen -> Speicherorte -> Öffnen Sie den Ordner DerivedData und ziehen Sie ihn in den Papierkorb.
Philip Fung

107

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. Löschen Sie die Verbindungen im Inspektor, wenn Dateibesitzer markiert ist

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.

Die Verbindung sollte hier bestehen, wenn die Tabellenansichtszelle markiert ist


4
Das hat es für mich getan, vielen Dank. Ich habe die Verbindungen entfernt, als in der linken Spalte "Dateibesitzer" ausgewählt wurde, dann meine benutzerdefinierte Zelle ausgewählt und sie erneut zugeordnet. Erfolg!
Rogare

Auch mit xcode7 funktioniert dies, verwenden Sie einfach das rechte Feld "Connections Inspector". Entfernen Sie die Steckdose aus der Tischzelle und vom Etikett, fügen Sie sie erneut hinzu, und alles sollte funktionieren.
Lifeisfoo

3
Dies funktioniert, aber Sie müssen sicherstellen, dass FileOwner nicht eingestellt wurde !! Der Dateieigentümer sollte NSObject bleiben. stackoverflow.com/questions/13793162/…
devjme

Die gleiche Antwort hat mich zweimal gerettet!
wm.p1us

98

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.

Geben Sie hier die Bildbeschreibung ein


Diese Antwort hat mir in einem bestimmten Fall geholfen. Ich muss weiter an einem alten Objektprojekt mit mehreren Zielen arbeiten. Ich habe eine benutzerdefinierte UITableViewCell in Swift erstellt und hatte den gleichen Fehler. Durch Aktivieren von "Vom Ziel erben" hat es funktioniert. Vielen Dank!
Magohamoth

Das Modul ist nicht immer richtig eingestellt. Beispiel, wenn Sie den Klassennamen eingeben, bevor Sie die Klasse erstellen.
Johan

Ich habe den Klassennamen ohne Drücken der Eingabetaste am Ende eingegeben, sodass die IDE dieses Flag nicht automatisch überprüft hat. 1 Stunde damit verschwendet. Vielen Dank.
MatPag

Diese Art von Fehler ist in obj-c nie aufgetreten. Aber danke, es hat das Rätsel gelöst.
Pradeep Kachhawaha

Warum ist dies auf der 3. Seite begraben?
Sergio

65

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.


2
Ja, das war es für mich. Während ich herumwirbelte, um einen neuen Controller für die Startansicht hinzuzufügen, stellte ich dies auf die neue Klasse / Feder ein. Nachdem ich den View Outlet angeschlossen hatte, traf ich diesen Fehler. Durch Löschen dieses Feldes wurde das Problem behoben.
Terriblememory

Das hat bei mir funktioniert. Beachten Sie, dass ich auch die alte Version vom Gerät / Simulator löschen musste, damit sie funktioniert.
Jimt

Danke - das war mein Problem. Ich hatte meine iPad-Storyboard-Datei umbenannt und die Einstellungen meines Projekts nicht aktualisiert.
Robert Joseph

2
Vielen Dank! Das hat es für mich gelöst. (Ich musste die App aus dem Simulator löschen, nachdem ich das Feld Hauptschnittstelle so geändert hatte, dass es leer war. Durch einfaches Ändern dieses Felds wurde der Simulator nicht gezwungen, den Cache zu brechen.)
Snipe

Ich erinnerte mich, dass ich Dinge von einer universellen App zu einer iPhone-App geändert hatte und dies den Fehler behoben hatte!
Justin

59

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.

Geben Sie hier die Bildbeschreibung ein

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


Vielen Dank! Das hat es für mich behoben. Ich habe dieses Problem schon lange und wusste nicht, wie ich es beheben sollte, außer von vorne anfangen. Dies war es, löschte IBOutlets aus dem View Controller, wusste aber nicht, dass sie im Eigentümer noch referenziert / verknüpft waren (in diesem Fall "View Controller" im Interface Builder - Xcode 6).
Ira Herman

41

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.

Geben Sie hier die Bildbeschreibung ein


37

In meinem Fall handelt es sich um einen Fehler im Storyboard-Quellcode. Führen Sie die folgenden Schritte aus:

  1. Öffnen Sie zuerst Ihr Storyboard als Quellcode
  2. suchen nach <connections>
  3. Entfernen Sie unerwünschte Verbindungen

Zum Beispiel:

<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 Verbindungen zwischen den Namen Ihrer Codevariablen und den XML-Tags des Storyboard-Layouts;)


33

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

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.


Ayyy dag nab it ... Ich kann nicht glauben, wie oft ich diesen Fehler mache. Danke lol
Benjamin

31
  1. Sie müssen nur IBOutleteinmal angeben , die IBOutletBezeichnung Ihres Ivar ist nicht erforderlich.
  2. Instanziieren Sie Ihre NIB mit Ihrer UIViewController? Irgendwann sollten Sie anrufen[SecondView initWithNibName:@"yourNibName" bundle:nil];

Das hat geholfen! Ich habe einen Fehler bei der Codierung der Schlüsselwertcodierung für eine Eigenschaft von einem anderen Ansichtscontroller erhalten. Es stellte sich heraus, dass ich -initWithNibNamemit dem falschen Spitznamen angerufen habe .
Jlstrecker

Ja , das half mir auch .. ich die UIViewController wurde anstelle von MyCustomeViewController .. aber dies ist eine Art Hierarchie Problem .. wird die Innerlichkeit wegen des Fehl platziert Klassenobjekts fehlgeschlagen .. Danke sowieso
futur

Ich hatte ein ähnliches Problem. Zwei identische IBAction-Einträge aus Versehen. Wurde nicht im Code angezeigt, sondern nur mit der rechten Maustaste auf das UIControl (in meinem Fall ein UIStepper). Nur das Löschen eines hat es behoben.
Dave Hubbard

30

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.


Das löst mein Problem. tsk2x fast 3 Tage Kopfschmerzen.
user3818576

5
Es gibt eine Antwort auf die Frage. In Nib ist etwas durcheinander geraten, und eine Reinigung hat es gelöst. Ich las und versuchte alles oben ohne Erfolg und machte dann die Reinigung, und nachdem ich 1 Stunde lang versucht hatte, es zu reparieren, reparierte Majs Lösung es. Ich hätte gerne gesehen, was im XML dies verursacht haben könnte, aber ich bin weitergegangen.
LevinsonTechnologies

Dies löst in der Tat das Problem - ich habe oben zahlreiche Vorschläge ausprobiert und nur das Projekt bereinigt diesen Fehler, der plötzlich auftrat. Ugg ...
DustinB

Dies behebt mein Problem, ich habe viele der oben genannten Vorschläge ausprobiert. Erscheint merkwürdig!
Naveen Shan

23

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:

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

An Stelle von:

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

Wo

DeviceViewController

War der Name meiner Klasse auch bekannt als

DeviceViewController.h 
DeviceViewController.m

Du musst

"import DeviceViewController.h"

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:

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

DANKE für all die Schritte dort, ich habe Xcode 5 verwendet und wusste nicht wirklich, wie man eine Feder manuell hinzufügt, da man standardmäßig nur Storyboard hinzufügen kann ... Ich habe einige Anweisungen erhalten, die aber nicht so detailliert sind wie Ihre. Wirklich geholfen !!
Pittfall

"Ich habe das falsch gemacht ..." Danke, es ist nicht das erste Mal, dass ich wegen dieses wirklich dummen Fehlers viel
ausgebe

23

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.


Vielen Dank! Ich bin ein n00b auf Xcode und habe eine Weile gebraucht, um die Schurken-Links zu finden. In Xcode 9.2 können Sie mit der rechten Maustaste auf das Element in der Storyboard-Ansicht klicken und die "Referenzierungsstellen" aktivieren.
Kunigami

21

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

  • eine benutzerdefinierte Ansicht haben
  • Es wurde eine @ IBInspectable-Eigenschaft hinzugefügt
  • und später gelöscht

Dann erhalten Sie möglicherweise auch einen ähnlichen Fehler wie

Fehler beim Festlegen der benutzerdefinierten geprüften Eigenschaft (xxx) für [Ihre benutzerdefinierte Ansicht] ...: Diese Klasse ist für den Schlüssel [xxx] nicht mit der Schlüsselwertcodierung kompatibel.

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

Geben Sie hier die Bildbeschreibung ein

Ö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 (-).


Ich bin so oft auf diese Seite gekommen ... Dieses Mal hat es diese Lösung geschafft! Aber so seltsam es klingt, dass die alte zu löschende Eigenschaft tatsächlich auf einem anderen ViewController war als von dem, auf dem sie abstürzt, ich habe keine Ahnung warum.
Cinn

15

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:

Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIViewController 0x18afe0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key welcomeLabel.'

Die Lösung beim programmgesteuerten Erstellen kann folgende sein:

-(void)loadView {
    // Ensure that we don't load an .xib file for this viewcontroller
    self.view = [UIView new];
}

12

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.


Abstimmung, da es in meinem Fall so war. Ich benutze Swift und Storyboards. Als ich ein neues Build-Ziel erstellt habe (um eine Build-Variante zu erstellen), hat die App in der neuen Variante nicht funktioniert, während die erste in Ordnung war. Die App stürzte auf einem View Controller ab, bei dem der Modulname vom ersten Ziel an auf Modul gesetzt wurde, während er in funktionierenden View Controllern Aktuell war - <Modulname hier> . In diesem Fall müssen Sie dort den Modulnamen löschen.
Mixaz

11

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.


9

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 NSObjectund setValue:forKeyauf 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 mit setValue:forKey.

Schließlich fing ich an, all diese setValue:forKeyZeilen zu kommentieren und stellte fest, dass mein defaultFall für switch-Anweisungen funktionierte String?.

Ich habe schließlich herausgefunden, dass Sie keine optionalen schnellen Typen verwenden können, es setValue:forKeysei denn, sie haben eine direkte Zuordnung zu einem Objective-C-Typ wie String?oder NSNumber?. Am Ende habe ich alle CShort?Typen geändert, NSNumber?da dies eine direkte Zuordnung hat. Denn Bool?in meinem Fall war es für mich in Ordnung, nur die Verwendung Boolund initialisieren es false. 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:

Sie können KVC nicht für eine optionale Int-Eigenschaft verwenden, da KVC Cocoa / Objective-C ist und Objective-C kein optionales Int sehen kann - es ist nicht mit Objective-C verbunden. Objective-C kann nur Typen sehen, die mit Objective-C verbunden sind:

Klassentypen, die von NSObject abgeleitet sind

Klassentypen, die mit @objc verfügbar gemacht werden

Schnelle Strukturen, die überbrückt werden


1
Wenn Sie versuchen, einen Swift-Bool-Wert über Cocoa-Bindungen zu verbinden, müssen Sie ihn mit der Direktive @objc verfügbar machen. Andernfalls erhalten Sie tatsächlich diesen Fehler. Dies sollte die beste Antwort sein.
Jvarela

9

"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

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, daher kann es jemandem helfen, der das gleiche Problem hat


8

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.


8

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.


7

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.


7

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.

  1. Überprüft, ob 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 die Schaltfläche keine zusätzlichen Aktionen oder Ausgänge enthält, die Sie möglicherweise versehentlich erstellt haben. (Dies 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 im NÄCHSTEN BILDSCHIRM die richtigen Aktionen ausführen. Wenn Segues vorhanden sind, stellen Sie sicher, dass sie eine eindeutige Kennung haben. (Das war das Problem)
    • Eine der Segmente hatte keine eindeutige Kennung
    • Eine der Tasten hatte eine Aktion und zwei Steckdosen, die ich versehentlich erstellt habe.
    • Löschen Sie alle zusätzlichen Steckdosen und stellen Sie sicher, dass Sie in den Abschnitten zum nächsten Bildschirm eindeutige Kennungen haben.

Prost,


6

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:

  1. Markieren Sie Ihre .m-Datei.
  2. Wählen Sie im rechten Bereich den Dateiinspektor aus.
  3. Stellen Sie im Abschnitt "Zielmitgliedschaft" sicher, dass das entsprechende Build-Ziel aktiviert ist.

Hoffe das hilft jemandem da draußen.


6

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.


Dies funktionierte beim Kopieren und Einfügen einer Szene im Storyboard-Editor.
Mizmor

5

In meinem Fall. Ich hatte nach dem Zusammenführen keine fehlenden Steckdosen in xib-Dateien.

Umschalt + Befehl + K.

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


4

In meinem Fall wurde dies durch die Referenzierung der falschen Feder verursacht:

BMTester *viewController = [[BMTester alloc] initWithNibName:@"WrongNibName" bundle:nil];

1
Passiert mir, wenn ich die Klasse des View Controllers umbenenne und vergesse, dass sich auch der Name der Schreibfeder ändern muss. Da der Nib-Name nur eine Zeichenfolge ist, liegt kein Compilerfehler vor.
Kris

3

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.


Ich habe diesen Fehler erneut erhalten. Dieses Mal habe ich einen neuen Controller für leere Tabellenansichten erstellt, dem meine Klasse zugewiesen wurde, wobei die nicht funktionierende Klasse in Ruhe gelassen wurde, und den Übergang dorthin verschoben. Das hat funktioniert. Ich habe dann langsam jedes Element in der Ansicht kopiert, bis es erneut fehlschlug. Dieses Mal stellte sich heraus, dass ich einem Picker einige "benutzerdefinierte Laufzeitattribute" zugewiesen hatte (ich dachte, ich könnte sie verwenden, um den Picker zu initialisieren, damit ich es nicht im Code tun muss, keine Ahnung, ob das möglich ist ). Durch das Entfernen wurde das Problem behoben. Dieser Fehler ist wirklich schrecklich, ich hoffe, er wird in einer zukünftigen Version verbessert!
Symmetrisch

3

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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.