it-swarm.com.de

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

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 es reparieren?

*** Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSUnknownKeyException', Grund: '[<UIViewController 0x6e36ae0> setValue: forUndefinedKey:]: Diese Klasse ist nicht mit der Schlüsselwertcodierung für den Schlüssel XXX kompatibel.'

Vielen Dank.

1120

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 nicht mit der Schlüsselwertcodierung für die Schlüsselzeichenfolge kompatibel.'

Es wird durch den View-Controller Second in MainWindow.xib mit der Klasse UIViewController ANSTELLE VON SecondView verursacht. Das Ändern der richtigen Klasse behebt das Problem.

Übrigens ist es üblich, in Objective-C Namen wie "string" zu haben. Es wird eine Laufzeit-Namenskollision ausgelöst. Vermeiden Sie sie auch in einmaligen Übungs-Apps. Das Auffinden von Namenskollisionen kann sehr schwierig 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 die Verknüpfung zum ursprünglichen Controller bei, auch nachdem dieses Element bearbeitet und erneut in den neuen Controller eingebunden wurde.

Ein weiterer möglicher Grund für diesen Fehler:

Schlechtes Outlet.

Sie haben entweder einen entfernten oder Outlet-Namen in Ihrer .h-Datei umbenannt .

Entfernen Sie sie im Verbindungsinspektor der Datei .xib oder .storyboard.

931
TechZen

Möglicherweise haben Sie eine schlechte Verbindung in Ihrem xib.

Ich habe diesen Fehler oft gehabt. In diesem Fall ist die Antwort von TechZen absolut richtig. Eine weitere häufige Ursache ist, dass Sie den Namen einer IBOutlet-Eigenschaft in Ihrer .h/.m ändern, mit der Sie bereits eine Verbindung hergestellt haben Der Besitzer der Datei in der Schreibfeder.

Von deiner Feder:

  1. Wählen Sie das Objekt in IB aus und rufen Sie den Verbindungsinspektor auf.
  2. Vergewissern Sie sich unter "Verweisstellen", dass Ihr Objekt noch nicht mit dem alten Eigenschaftsnamen verbunden ist. Wenn dies der Fall ist, klicken Sie auf das kleine "x", um den Verweis und zu löschen wieder aufbauen.

    example 1

Eine weitere häufige Ursache, wenn Sie Storyboard verwenden, kann sein UIButton mehr als eine Zuweisung haben (Lösung ist fast die gleiche wie für die 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 abgeblendeten "Main ..." - Fenster mit dem kleinen "x":

    example 2

1487
nuttysimple

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

110
Steve Rogers

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 hatte, verursachte dies den Fehler "Diese Klasse ist nicht mit der Schlüsselwertcodierung für den Schlüssel kompatibel". Nachdem ich diese gelöscht hatte, wurde der Fehler behoben.

Löschen Sie die Verbindungen im folgenden Bild. Delete the connections in inspector when File Owner is highlighted

Stellen Sie einfach sicher, dass Sie nur die Verbindungen mit der Tabellensichtzelle haben. Um dies zu überprüfen, klicken Sie auf die Tabellenzelle und suchen Sie in INSPECTOR nach Ihren Verbindungen.

The connection should be in here when Table View Cell is highlighted

103
uplearnedu.com

Manchmal hat dies mit Ihrem "Inherit From Target" zu tun. Dieser Wert muss festgelegt werden. Bei Einzelziel-Apps können Sie einfach Von Ziel übernehmen auswählen. Wenn Sie mehr als ein Ziel haben, wählen Sie das gewünschte Ziel aus.

enter image description here

83
mrabins

Stellen Sie sicher, dass das folgende Feld leer ist, wenn es sich nicht um eine universelle, sondern um eine reine iPhone-App handelt:

Ziele> Übersicht> Informationen zur iPhone-/iPod-Bereitstellung> Hauptschnittstelle

Wenn Sie dort eine xib angeben, stürzt sie ab.

64
erkanyildiz

Dieser Fehler zeigt an, dass ein bereits verbundener Interface Builder Objekt wird entfernt/umbenannt in der Quelle seines Besitzers (Besitzer der Datei) ist.

Klicken Sie bei gedrückter Ctrl-Taste im Interface Builder auf Eigentümer der Dateien, wenn ein Ausrufezeichen angezeigt wird.

In der Abbildung unten sehen Sie, dass "aRemovedView" rechts ein Ausrufezeichen hat, weil ich das IBOutlet-Ansichtsobjekt entfernt habe, während es bereits mit dem IB verbunden war.

enter image description here

Dies führt zu folgendem Fehler: Beenden der App aufgrund einer nicht erfassten Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist für den Schlüssel nicht schlüsselwertkodierungskonform aRemovedView. '

60
Tibidabo

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 übertragen.

Schließlich löste ich das Problem, indem ich die Beschriftung über den unter Objekte (im Bild unten hervorgehoben) aufgeführten Controller und nicht über Dateieigentümer verknüpfte.

Hoffe das hilft.

enter image description here

41
Eric Brotto

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

  1. öffne zuerst dein Storyboard als Quellcode
  2. suche 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.

36

enter image description hereenter image description here

Mein Fix ähnelte dem von Gerard Grundy. Beim Erstellen einer benutzerdefinierten UITableViewCell mithilfe einer XIB-Datei habe ich versehentlich den Namen der benutzerdefinierten Klasse auf den Eigentümer der Datei und nicht 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.

33
ashack
  1. Sie müssen IBOutlet nur einmal angeben, die Bezeichnung IBOutlet für Ihren Ivar ist nicht erforderlich.
  2. Instanziieren Sie Ihre NIB mit Ihrem UIViewController? Irgendwann solltest du [SecondView initWithNibName:@"yourNibName" bundle:nil]; anrufen
30
kubi

Dies passierte mir nur beim Debuggen auf einem Gerät (iPhone). Der iOS-Simulator funktionierte einwandfrei. Ein "Product-> Clean" von Xcode aus zu machen schien das Problem zu lösen, aber ich habe keine Ahnung warum.

30
Maj

Dies kann darauf zurückzuführen sein, dass Sie die Steuerung gezogen und einen Ausgang oder eine Aktion erstellt haben und vergessen haben, diese zu löschen. Selbst wenn Sie den Code gelöscht haben oder wenn Sie genug cmd + Z erstellt haben, müssen Sie im Verbindungsinspektor Ihres Storyboards nachsehen, ob die von Ihnen erstellte Aktion oder Ausgabe noch vorhanden ist oder nicht.

23
Ilansky Naftali

Ich hatte genau dieselbe Fehlermeldung und danke (!!) an Kira von http://www.idev101.com Ich konnte die Herausforderung lösen. Ich habe ihre Seite erst gefunden, nachdem ich über 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 ist aufgefallen, 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 z. ein weiterer UIViewController.

Es tut mir absolut nicht leid, wenn ich nur Anfängern wie mir das Offensichtliche sage und möglicherweise Abstimmungen erhalte, da dies nicht genau mit der Frage zusammenhängt, aber ich habe 4 (?!?) Stunden lang nach der Antwort auf diese Fehlermeldung gesucht . Wenn ich das 1 oder 2 Leuten ersparen könnte, wäre das großartig :)

PS: Für diejenigen, die daran interessiert sind, wie der Code zum Laden des anderen UIViewControllers weitergeht:

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

Wenn man sich die anderen Antworten ansieht, scheint es eine Menge Dinge zu geben, die diesen Fehler verursachen können. Hier ist noch einer.

Wenn du

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

Dann erhalten Sie möglicherweise auch eine ähnliche Fehlermeldung

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

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

enter image description here

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

20
Suragch

Dies passiert mir, wenn 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 zum folgenden 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 könnte sein:

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

Die "Module" -Eigenschaft von View Controller im Identitätsinspektor weicht möglicherweise von Ihren Erwartungen ab. Stellen Sie außerdem sicher, dass Ihrer Zielliste neue Klassen hinzugefügt werden.

12
ercu

Ich hatte ein ähnliches Problem bei einem Projekt mit zwei Zielen (mit einem eigenen 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. Das heißt Mit dem Interface Builder konnte ich es in MainWindow.xib angeben, aber zur Laufzeit konnte das System die Klasse nicht finden.

Das heißt Klicken Sie mit der rechten Maustaste auf die betreffende UIViewController-Klasse und überprüfen Sie, ob sie auf der Registerkarte "Ziele" enthalten ist.

10
David Carney

"Diese Klasse ist nicht mit der Codierung von Schlüsselwerten kompatibel." Ich weiß, dass es etwas spät ist, aber meine Antwort ist anders. Ich denke, es muss gepostet werden. 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, es kann also jemandem helfen, der das gleiche Problem hat

9
Emy Stats

Nur um das zu ergänzen, weil ich auch diesen Fehler bekommen habe. All diese Antworten scheinen sich auf die Arbeit mit der Benutzeroberfläche und dem Storyboard zu beziehen. Ich weiß, dass das ursprüngliche Poster anscheinend mit der Benutzeroberfläche funktioniert, aber bei der Suche nach möglichen Gründen für diesen Fehler führen meist alle Fragen zu dieser Frage, wobei die anderen als Duplikate geschlossen werden oder einfach Probleme mit dem Verbinden von Dingen in einem Storyboard haben füge meine Lösung hinzu.

Ich arbeitete an der Codierung eines Webdienstes in Swift 2. Ich hatte alle erforderlichen Proxy-Objekte und -Stubs erstellt. Während ich die zurückgegebene XML-Datei durchlief, instanziierte ich dynamisch meine Objekte, die alle aus NSObject stammten, und verwendete setValue:forKey für sie. Jedes Mal, wenn setValue:forKey versucht hat, eine Eigenschaft festzulegen, ist dieser Fehler aufgetreten.

Ich hatte eine switch-Anweisung für jeden Typ, mit dem ich zu tun hatte (z. B. Bool?, CShort?, String?) und für jeden XML-Knoten, den ich durchlaufen und überprüft habe, welcher Typ sich auf dem Objekt und befand konvertierte dann den Wert in diesen Typ und versuchte, ihn mit setValue:forKey festzulegen.

Schließlich fing ich an, alle diese setValue:forKey Zeilen zu kommentieren und stellte fest, dass mein default switch Anweisungsfall für String? funktionierte.

Ich habe schließlich herausgefunden, dass Sie nicht optionale Swift -Typen mit setValue:forKey verwenden, es sei denn, sie haben eine direkte Zuordnung zu einem Objective-C-Typ wie String? oder NSNumber?. Schließlich habe ich alle CShort? -Typen in NSNumber? geändert, da diese direkt zugeordnet sind. Für Bool? war es in meinem Fall in Ordnung, Bool zu verwenden und auf false zu initialisieren. Andere mögen diesen Luxus nicht haben.

Was für ein Kopfschmerz, der so 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 !!".

Um es zum Schluss noch einmal zu wiederholen, funktioniert die Key-Value-Codierung nicht mit Optionen. Unten habe ich irgendwo etwas gefunden, aber ich vergesse, wo ich mich bei wem auch immer entschuldige und würdige, wenn ich mich 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 keine optionale Int-Eigenschaft sehen kann - sie 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

9
AtheistP3ace

Dies kann der Fall sein, wenn Sie auf eine Komponente in Xib Interface verweisen, die Sie umbenannt oder gelöscht haben. Das erneute Referenzieren funktioniert bei mir.

8
MehrozKarim

Ich hatte gerade dieses Problem in meinem duplizierten Projekt und löste es, indem ich 2 Stellen ankreuzte:

1- Stellen Sie sicher, dass Sie die .m-Datei in der Liste -> Projekt - Phasen erstellen - Quellen kompilieren haben
2- Gehen Sie danach zum Interface Builder (wahrscheinlich tritt dieser Fehler nur bei IB auf) und heben Sie die Verknüpfung aller Eigenschaften, Beschriftungen, Bilder usw. auf. Verknüpfen Sie dann alle erneut. Ich habe festgestellt, dass ich ein Attribut entfernt habe, es aber immer noch mit IB verknüpft war.

Hoffe, es funktioniert für einige.

8
kubilay

Dieser Fehler ist etwas anderes!

Hier ist, wie ich es behoben habe. Ich benutze xcode Version 6.1.1 und benutze Swift. Ich habe diese Fehlermeldung jedes Mal erhalten, wenn meine App versucht hat, eine Überblendung durchzuführen, um zum nächsten Bildschirm zu springen. Hier was ich getan habe.

  1. Es wurde überprüft, ob der Knopf mit der richtigen Aktion verbunden ist. (Dies war nicht das Problem, aber dennoch 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 haben. Wenn Segmente vorhanden sind, stellen Sie sicher, dass sie eine eindeutige Kennung haben. (Das war das Problem)
    • Eines der Segmente hatte keine eindeutige Kennung
    • Einer der Knöpfe hatte eine Aktion und zwei Ausgänge, die ich versehentlich erstellt habe.
    • Löschen Sie alle zusätzlichen Steckdosen und vergewissern Sie sich, dass Sie in den Abschnitten zum nächsten Bildschirm eindeutige Kennungen haben.

Prost,

7
Ronaldoh1

Ein weiteres "nicht konformes" Problem war, dass ich aus irgendeinem Grund zwei Kopien einer Klasse hatte.

Ich habe der falschen Kopie Schlüssel hinzugefügt. Interface Builder hat die Schlüssel immer noch gesehen und mich mit ihnen verbinden lassen, aber zur Laufzeit hat es die andere Kopie der Klasse verwendet, die die neuen Schlüssel nicht hatte.

Um herauszufinden, welches 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 zuerst meine Änderungen von der nicht verwendeten Kopie übernommen hatte).

Moral der Geschichte: Doppelte Klassendateien sind schlecht.

7
Jason

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

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

6
Damo

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 dies bedeutet, dass meine Klasse nicht erstellt und in meine App aufgenommen wird.

So korrigieren Sie es:

  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 Erstellungsziel aktiviert ist.

Hoffe das hilft jemandem da draußen.

6
Mike M. Lin

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

Umschalt + Befehl + K

mein problem gelöst. Ich habe mein Projekt aufgeräumt und umgebaut.

5
Malder

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

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

Ich hatte das gleiche Problem. Ich habe eine tableviewCell in einer XIB-Datei erstellt und diese Art von Fehler erhalten. Mein Problem war, dass ich die Klasse "File's Owner" als meinen Cell View Controller definiert habe. Ich habe es einfach herausgenommen und die Klasse der Zelle festgelegt (in der XIB-Datei auf den Rand der Zelle klicken, zur dritten Registerkarte im rechten Bereich gehen und dort angeben, wo die Klasse Ihren Ansichts-Controller ausgewählt hat).

Versuchen Sie auch, Ihren Code zu bereinigen.

3
pedrotorres

Ich habe das gleiche Problem. Ich habe den Simulator zurückgesetzt. Entfernen und Hinzufügen von Schaltflächensteuerelementen und endlich sauber gemacht. :) Dank Stapelüberlauf. Einige, wie mein Code in Ordnung wurde und anfing zu arbeiten.

3
priya

Möglicherweise haben Sie Ausgänge zum UI-Element, aber keine IBOutlet-Eigenschaft in der .h-Datei

Für alle UI-Elemente in Verbindungsattribut-Check-Outlets und die dazugehörige Eigenschaft in der .h-Header-Datei.

Möglicherweise fehlen ein oder mehrere Eigenschaftseinträge in der .h-Datei.

3
Avinash Jadhav

Ich habe diesen Fehler mit Storyboards bekommen. Die obige Lösung schien nicht das Problem zu sein, und so löschte ich den View Controller und fügte ihn wieder hinzu (und natürlich verband ich den Abschnitt wieder und ordnete die Klasse neu zu), wodurch es behoben wurde. Ich weiß nicht, was es wirklich war, aber ich hatte die zugehörige View-Controller-Klasse kurz zuvor umbenannt, also hatte das vielleicht etwas abgespritzt.

3
Symmetric

Überprüfen Sie, ob Sie über Streuverweisstellen verfügen, indem Sie das betreffende Objekt in der Storyboard/xib-Oberfläche auswählen und den Verbindungsinspektor öffnen (Ansicht-> Dienstprogramme-> Verbindungsinspektor anzeigen). Wenn Sie die unerwünschten Verbindungen entfernen und Sie sollten bereit sein, zu gehen.

Ich hatte das gleiche Problem. Dies geschah mit meinem Projekt, weil ich meinen Produktnamen geändert habe, aber im Interface Builder hatte ich den alten Namen als Modul. Dies führt zum Absturz. Überprüfen Sie also, ob der Name des xib-Moduls ebenfalls geändert wurde oder nicht.

2
Jyotsna

Ich habe die Eigenschaft aus der Header-Datei gelöscht. Ich konnte keinen Verweis darauf finden, aber der Debug-Fehler verwies immer noch darauf. Ich fand, dass die NIB-Datei noch einen Verweis darauf hatte. Ich habe den Block gelöscht, auf den verwiesen wurde, und alles wurde behoben.

Im Projektnavigator

Suchen Sie die Nib (xib) -Datei. Rechtsklick und Quelltext anzeigen. Ich habe den folgenden vollständigen Abschnitt gelöscht

<object class="IBConnectionRecord">
    <object class="IBCocoaTouchOutletConnection" key="connection">
        <string key="label">DeleteLabel</string>
        <reference key="source" ref="372490531"/>
        <reference key="destination" ref="774585933"/>
    </object>
    <int key="connectionID">20</int>
</object>
2
Apple Pirate

Möglicherweise müssen Sie den Ausgang löschen und neu erstellen, indem Sie das Formular IB in eine H-Datei zeichnen.

2
IsPha

Dies passiert mir auch, wenn ein UI-Label oder ein anderes UI-Element von zwei Variablen in der View-Controller-Klasse referenziert wird und ich eine der Variablen lösche.

2
sysuser

Ich hatte dies passiert, als ich ein UIView in ein Storyboard eingebunden und IBOutlet wie folgt verbunden hatte:

@property (strong, nonatomic) IBOutlet UIView *someView

aber später habe ich das UIView zu einer benutzerdefinierten Klasse gemacht, aber vergessen, den Klassennamen dieses oben definierten IBOutlets zu ändern. Es ist ein seltsamer Fehler, denn wenn die benutzerdefinierte Ansicht keine Unteransichten enthält, beschwert sie sich nicht, aber sobald Unteransichten vorhanden sind, wird der in der Frage angegebene Fehler nur in einer der Unteransichten und nicht in der äußeren UIView angezeigt, in der das Problem tatsächlich besteht. Ich musste alle Unteransichten löschen und lesen, um das Problem zu finden, obwohl das eigentlich nichts mit den Unteransichten zu tun hatte

1
Fonix

In meinem Fall,

[[NSBundle mainBundle] loadNibNamed:@"NameOfTheSubviewNibFile" owner:self options:nil]

war der Grund.

ersetzen durch initWithNibName, behoben.

1
Deve Tester

Ich hatte das gleiche Problem, als ich das Hauptstoryboard als Startbildschirmdatei verwendete. Wenn Sie ein Storyboard als Startbildschirmdatei verwenden, sollte es nicht mit dem View-Controller verbunden sein, da es noch nicht geladen wurde.

1
IanS

Ich habe dieses Problem durch zwei Dinge gelöst:

  1. Feste Klassenreferenz der Ansicht:

  1. Alle Outlets neu importiert:

1

Eine weitere Ursache für diese Situation ist, dass Sie diese Eigenschaft als @dynamic deklarieren, die Klasse sie jedoch nicht in der übergeordneten Klasse finden kann.

1
Artem Shmatkov

Es könnte bedeuten, dass Sie versuchen, am Anfang einen Sortierdeskriptor ohne Vorzeichen zu verwenden. Wie in:

[array valueForKeyPath:@"distinctUnionOfObjects.self"]

Was muss eigentlich sein:

[array valueForKeyPath:@"@distinctUnionOfObjects.self"]

1
CommaToast

Das ist mir schon zweimal passiert.

Die Lösung bestand darin, das gesamte Storyboard neu zu erstellen, da ich es von einem anderen kopiert habe (weil es fast dasselbe war).

1

Ich hatte das gleiche Problem, und die Ursache lag in der Angabe eines Moduls in Interface Builder (anstatt es leer zu lassen). Wenn ich also ein anderes Modul als das von mir festgelegte benutzte, stürzte die App ab: S ... hoffe, das hilft jemand anderem, da mein Problem nicht auf eine defekte oder veraltete Steckdose zurückzuführen war!

1
Chris Allinson

Zusammen mit anderen Problemen, die Sie in anderen Antworten sehen können. Ich habe diesen Fehler für mich selbst erstellt, indem ich ein Projekt von Grund auf neu gestartet und zunächst die ursprüngliche Szene meines Storyboards gelöscht und dann eine Szene aus einem anderen Projekt in mein Storyboard eingefügt habe.

Das ist kein Problem. Sie müssen nur einen Einstiegspunkt in Ihr Storyboard einfügen, d. H. Überprüfen Sie den is initial View Controller, auf dem sich der gewünschte Ansichtscontroller befindet. Andernfalls wird es eine graue Szene sein und Sie einen Fehler werfen.

enter image description here

1
Honey

Gleiches Thema vorgestellt. Meine Lösung bestand darin, den richtigen Storyboard-Wert in die Dropdown-Liste Main Storyboard (Haupt-Storyboard) einzufügen. Ich hatte mainstoryboard.storyboard umbenannt, aber die Bereitstellungsinformationen nicht zurückgesetzt.

1

Ich bin aus einem anderen Grund auf dasselbe Problem gestoßen: Ich habe das Haupt-Storyboard als Startbildschirmdatei verwendet. Wenn Sie ein Storyboard als Startbildschirmdatei verwenden, sollte es nicht mit dem View-Controller verbunden sein, da es noch nicht geladen wurde.

1
IanS

Ich hatte dieses Problem mit Swift Klassen nach dem Upgrade auf xcode7. Gelöst mit der @ objc Direktive:

@objc (XXXViewController) Klasse XXXViewController

1
user1760527

Mein Problem begann, nachdem ich den Zielnamen geändert hatte.

In meinen eigenen benutzerdefinierten UI-Klassen wurde der Modulname auf den alten Zielnamen festgelegt.

Ich habe den Namen des Ziels in den neuen geändert und es funktioniert jetzt einwandfrei.

1
MBH

In meinem Fall wurde der Eigenschaftsname eines IBOutlets in einer ViewController.m-Datei geändert, der Name in Storyboard jedoch nicht. Das Problem wurde behoben, indem das IBOutlet per Strg-Ziehen wieder in ViewController.m eingefügt wurde. Ich habe auch einen Weg gefunden, solche "verwaisten" IBOutlets in XCode zu finden: (siehe Bild) Diejenigen, die nicht "verwaist" sind, haben konzentrische Kreise anstelle von Zeilennummern.

"Orphaned" IBOutlets don't have concentric circles in the line number column.

1
Roman Reimche

Ich hatte dieses Problem mit dem Storyboard und der Klasse Swift für den UI-View-Controller. Gelöst mit der @ objc Direktive:

@objc(MyViewController) class MyViewController
1
user1760527

Ich stoße beim Umgang mit meiner Tabellenzelle auf dasselbe Fehlerprotokoll. Ich habe festgestellt, dass meine UILabels Referenzierungs-Outlets (Sie können sie im Referenzinspektor überprüfen) sowohl für den Eigentümer der Datei als auch für die Klasse meiner Zelle dupliziert haben. Die Sache wird gut, wenn ich den Verweis auf den Eigentümer der Datei lösche.

0
JackieLam

Haben Sie Ihr Auswahlobjekt nicht verbunden?

lol 54 Antworten und keiner von ihnen ist meine Lösung. Sprechen Sie über einen häufigen Fehler.

In meinem Fall lag es daran, dass ich ein Auswahlobjekt auf meinem VC hatte und keinen Ausgang und keine Aktion dafür festgelegt hatte.

Ich lasse Schaltflächen usw. oft unverbunden, wenn ich nur nach dem Layout schaue. Aber es scheint, dass Sie dies nicht für einen Picker tun können.

0
tymac

Ich habe den gleichen Fehler erhalten, als ich manuell eine Ansicht von einer Schreibfeder geladen habe. Es stellte sich heraus, dass ich vergessen hatte, den Eigentümer der Ansicht festzulegen.

Für z.B. Wenn Sie eine Ansicht folgendermaßen laden,

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: nil,
                                 options: nil)?.first as! UIView

wenn Sie dann ein IBOutlet hinzufügen, kann nicht auf das IBOutlet verwiesen werden, und die Anwendung stürzt mit dem oben genannten Fehler ab.

Fix: Vergeben Sie einen Eigentümer für die Ansicht.

 let view = Bundle.main.loadNibNamed("MyNibFileName",
                                 owner: self,
                                 options: nil)?.first as! UIView
0
Abhi

Passen Sie einfach auf, wenn Sie versuchen, einen Wert zu beobachten, der nicht existiert.

Dies geschah mir einfach, als ich die "Text" -Eigenschaft eines Textfeldes beobachtete, als ich stattdessen die "Text" -Eigenschaft beobachten sollte.

0
Ahmed Elashker

Ich hatte den gleichen Fehler in einer etwas anderen Form:

In Interface Builder habe ich einen Navigationscontroller mit einem benutzerdefinierten Subcontroller. Der Klassenname wurde korrekt festgelegt, jedoch wurde der NIB-Name (Subcontroller auswählen, Attributes Inspector aufrufen) auf die falsche Datei festgelegt (im Grunde genommen auf ein anderes Ziel). Das Zurücksetzen auf den korrekten Dateinamen behebt das Problem.

0
sgvd

Die Ursache meines Problems war, dass ich eine Storyboard-Datei duplizierte (außerhalb von Xcode, wenn ich mich richtig erinnere), und alle View-Controller in der duplizierten Datei dieselbe Objekt-ID hatten wie in der Originaldatei. Abhilfe schaffen die kopierten View Controller, die dann eine neue Objekt-ID erhalten. Sie können die Objekt-ID im Identitätsinspektor sehen.

0
Olle Raab

In meinem Fall hatte ich dem Storyboard einen ViewController hinzugefügt, ihm jedoch im Designer keine Storyboard-ID zugewiesen. Nachdem ich ihm einen Ausweis gegeben hatte, funktionierte es.

mit Xamarin/Visual Studio 2015.

0
Wes

Stellen Sie sicher, dass Sie die (auch leere) Implementierung der benutzerdefinierten Klasse in der Datei .m wie folgt hinzufügen:

@implementation MySubclass
@end
0
Iulian Onofrei

Ich habe eine andere Möglichkeit gefunden, die das Problem verursachen könnte.

Wenn Sie die Methode "initWithNibName" mit dem falschen xib-Namen verwenden, führt dies ebenfalls zu einem Absturz dieser Art.

So können Sie beispielsweise den Namen einer xib-Datei ändern und anschließend den in der Methode "initWithNibName" verwendeten Namen in denselben Namen ändern.

0
Li Fumin

Manchmal werden Swift Dateien nicht zum Ziel hinzugefügt oder von diesem entfernt. Gehen Sie zu Ziel -> Build-Einstellung -> Quellen kompilieren -> prüfen Sie, ob eine erforderliche Swift Klassendatei fehlt oder nicht . In meinem Fall stürzte die Anwendung ab, weil die Quelldatei Swift beim Kompilieren nicht vorhanden war.

0
jatin

Ich hatte auch dieses Problem. Ich hatte eine Ansicht mit einem IBOutlet von einer xib-Datei in eine andere xib-Datei kopiert. Und obwohl ich die alte Referenz entfernt und eine neue Referenz erstellt hatte, trat dieser Fehler immer noch auf.

Am Ende habe ich xcode neu gestartet, um dieses Problem zu beheben.

0
Rickster

In der Regel ist die Antwort von @ TechZen der Trick, wenn mir das passiert. Gestern habe ich mich jedoch peinlich lange mit Storyboard-Verbindungen beschäftigt, um festzustellen, dass das Problem in meinem Code liegt.

Ich habe einen benutzerdefinierten Ansichts-Controller, der verschiedene Layouts in meinem Storyboard verwaltet, aber für eines der Layouts war eine spezielle Bezeichnung erforderlich, die von den anderen nicht verwendet wurde. Also habe ich eine Unterklasse wie folgt erstellt:

@interface MyViewControllerSubclass : MyViewController

Dann habe ich eine Privateigenschaft in MyViewControllerSubclass.m hinzugefügt:

@interface MyViewController ()
@property (weak, nonatomic) IBOutlet UILabel *crashesApp;
@end

Mit Xcode konnte ich dieses IBOutlet problemlos verbinden, doch jedes Mal, wenn die Ansicht geladen wurde, stürzte die App mit dem alten "nicht schlüsselwertkonformen Schlüssel 'chrashesApp'" ab.

Die Lösung, die im Nachhinein halbwegs offensichtlich ist, bestand darin, die private Kategorie zu ändern, um den richtigen Namen zu verwenden, d. H. Den der nterklasse:

@interface MyViewControllerSubclass ()
@property (weak, nonatomic) IBOutlet UILabel *noMoreCrashing;
@end
0
clozach

Ich erinnere mich, dass ich in der Vergangenheit ein ähnliches Problem hatte. Ich habe es gelöst, indem ich die Zeile geändert habe:

_vicMain = [[UIViewController alloc] initWithNibName:@"vicMainScreen" bundle:nil];

in:

#include "vicLogin_iPad.h"       // This is the H file of the class holding the code for
                                 // processing all the IBOUtlets for the Login screen
.
.
.

_vicMain = [[vicLogin_iPad alloc] initWithNibName:@"vicMainScreen" bundle:nil];

Beachten Sie, dass ich anfänglich UIViewController deklarierte, um mein _vicMain zu initialisieren. Nachdem ich ein Popup-Fenster oben verwendet hatte, stellte ich fest, dass beide denselben UIViewController verwenden.

Durch:

1) EINSCHLIESSLICH Ihrer Klasse (der Unteransicht), zusammen mit demselben Modul, das das obige _vicMain ausführt (bei dem es sich um ein View-Controller-Objekt/eine Variable handelt), in meinem Fall also "vicLogin_iPad.h", und:

2) Deklarieren Sie das Objekt mit Ihrem benutzerdefinierten Konstruktor (d. H. Anstelle von "xxx = [UIViewController alloc] ..." verwenden Sie stattdessen "xxx = [vicLogin_iPad alloc] ...".

das Problem ist gelöst.

Ich hoffe, dass dies hilft, da es ein Schmerz war, den Mangel an Details aus der Fehlermeldung herauszufinden ...

Grüße Heider Sati

0
Heider Sati

Dieses Problem tritt auch auf, wenn Sie eine kleine Unteransicht in einer separaten XIB-Datei in Interface Builder entwerfen möchten und diese in IB auf dieselbe Klasse wie die übergeordnete Ansicht festlegen.

Wenn du es dann so zeigst:

UIViewController *vc = [[UIViewController alloc] initWithNibName:@"NameOfTheSubviewNibFile" bundle:nil];
[self.view addSubview:vc.view];

Die Ansicht wird angezeigt, aber wenn IBOutlets mit ihrem Dateieigentümer verbunden ist, wird die Fehlermeldung angezeigt. Das sollte also stattdessen funktionieren:

  1. Deklarieren Sie im Code der übergeordneten Ansicht ein IBOutlet UIView *mySubview, um auf die Ansicht in der NIB-Datei der Unteransicht zu verweisen
  2. Verbinden Sie in der NIB-Datei der Unteransicht den Dateieigentümer mit der Ansicht und setzen Sie ihn auf mySubview.
  3. zeige es indem du tust:
 [[NSBundle mainBundle] loadNibNamed: @ "NameOfTheSubviewNibFile" Eigentümer: self options: nil] 
 [Self.view addSubview: mySubview]; 

und dir wird es gut gehen!

0
Eric

Ein weiterer kniffliger Fall:

In IB wurde ViewController zum Storyboard hinzugefügt, die Ansicht gelöscht und die benutzerdefinierte Klasse auf "MyViewController" festgelegt, damit die Ansicht über MyViewController.xib instanziiert wird

Wenn Sie die gleiche Storyboard-ID wie "MyViewController" angeben, tritt eine Ausnahme auf.

Durch Ändern der Storyboard-ID in einen anderen Namen wird das Problem behoben.

0