Beenden der App aufgrund der nicht abgefangenen Ausnahme "NSUnknownKeyException": Absturz der iOS-App [duplizieren]

9

Ich bin ein Anfänger-Programmierer, der an iPhone-Apps arbeitet. Ich habe mich gefragt, ob mir jemand mit einem Fehler in meiner App helfen könnte. Bei der Programmierung auf XCode habe ich festgestellt, dass meine App beim Start plötzlich abgestürzt ist, nachdem ich etwas mehr Code hinzugefügt habe. Das Ausgabefeld zeigte den folgenden Fehler:

  

* Beenden der App aufgrund der nicht abgefangenen Ausnahme 'NSUnknownKeyException', Grund: '[setValue: forUndefinedKey:]: Diese Klasse ist für die Schlüsselwiedergabe nicht Schlüsselcodierung-kompatibel.'       * Erster Aufrufstapel:       (0x1c91012 0x10cee7e 0x1d19fb1 0xb7ae41 0xafc5f8 0xafc0e7 0xb26b58 0x230019 0x10e2663 0x1c8c45a 0x22eb1c 0xf37e7 0xf3dc8 0xf3ff8 0xf4232 0x433d5 0x4376f 0x43905 0x8eceab6 0x4c917 0x1096c 0x1194b 0x22cb5 0x23beb 0x15698 0x1becdf9 0x1becad0 0x1c06bf5 0x1c06962 0x1c37bb6 0x1c36f44 0x1c36e1b 0x1117a 0x12ffc 0x222d 0x2155)       libc ++ abi.dylib: terminate heißt eine Ausnahme auslösen       (lldb)

Der Code, der beim Beenden der App angezeigt wird, lautet wie folgt:

%Vor%

Mein ViewController.h zeigt:

%Vor%

Auch mein ViewController.m zeigt

%Vor%

Es tut mir leid, Ihre Zeit zu verschwenden, aber ich habe diesen Fehler für eine lange Zeit und würde es mögen, wenn Sie eine Lösung hätten.

    
George523 09.07.2013, 01:52
quelle

1 Antwort

35

Was das Problem ist:

Zur Laufzeit wird Ihr View-Controller aus seinem XIB / Storyboard deserialisiert. Während dieses Prozesses werden alle Objekte in Ihren IB-Dateien gelesen und mit einem NSCoder instanziiert. Da diese Objekte in Ihrer Ansicht instanziiert werden, liest es die Verbindungen IBOutlet und IBAction in Ihrem Storyboard und beginnt, die hydrierten Objekte den Eigenschaften zuzuordnen, die zu design Zeit verbunden waren Sie haben programmatischen Zugriff auf sie bei run Zeit. Aber hier ist der Kicker: Wenn Sie eine Verbindung haben, die auf eine Eigenschaft verweist, die nicht existiert, wird diese Ausnahme ausgelöst, weil eine Eigenschaft angegeben wurde, die wirklich nicht vorhanden ist.

Was passiert, ist, dass Ihr Storyboard / XIB erwartet, dass Ihre Klasse eine Eigenschaft namens play hat. Wie Ihre Schnittstelle zeigt, haben Sie keine Eigenschaft, die so heißt. Ich vermute allerdings, dass du das gewöhnt hast, aber es in playbtn umbenannt hast.

Dies ist, was mit

gemeint ist
  

Diese Klasse ist für die Schlüsselwiedergabe nicht key-coding-kompatibel

Es bedeutet, dass es versucht hat, so etwas unter der Decke zu tun:

%Vor%

Wenn Sie mehr über Key / Value Coding und Serialisierung erfahren möchten, nehmen Sie sich einen bequemen Stuhl und lesen Sie Codierungshandbuch für Schlüsselwerte und Programmierhandbuch für Archive und Serialisierungen

Wie man es repariert:

Klicken Sie im Interface Builder mit der rechten Maustaste auf Ihren View-Controller und sehen Sie sich die Liste der Verbindungen an:

Sehen Sie, wie es eine Verbindung für die Eigenschaft play gibt und daneben ein kleines gelbes Dreieck? Dies ist der Interface Builder, der Sie warnt, dass Sie eine Verbindung haben, aber der Header zeigt nicht an, dass es einen IBOutlet des Namens gibt.

Sie müssen nur auf das kleine x klicken, um die Verbindung zur fehlenden Eigenschaft zu trennen.

Wie man dies in Zukunft verhindert

Jedes Mal, wenn Sie eine Eigenschaft in Ihrem Code ändern, müssen Sie sicherstellen, dass Sie alle zugeordneten Verbindungen in Interface Builder unterbrechen.

    
Wayne Hartman 09.07.2013, 02:33
quelle

Tags und Links