Klasse mit dem Namen IBNSLayoutConstraint konnte nicht instanziiert werden

81

Ich benutze XCode6 Beta und probiere Swift aus. Wenn ich einige Einschränkungen für das automatische Layout in einen Ansichts-Controller einfüge, stürzt die App mit dem folgenden Fehler ab: Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

zbrox
quelle
Hier gibt es nicht viel Code :) Der View Controller ist ein regulärer, frisch erstellter UIViewController mit einigen Ausgängen und dem regulären viewDidLoad und didReceiveMemoryWarning. Und dann gibt es die Einschränkungen in Interface Builder. Ich denke, ich kann hier den View Controller Code hinzufügen.
Zbrox

Antworten:

220

Dieser Fehler wird angezeigt, weil Sie eine Einschränkung für ein IBOutlet festgelegt haben, das zur Laufzeit entfernt wird. Dies geschieht, wenn Sie die Einschränkung in Interface Builder als Platzhalter festlegen. Da die Einschränkung entfernt wird, wird beim Aufheben der Archivierung ein Fehler ausgegeben, der besagt, dass dies nicht möglich ist.

Es gibt zwei Möglichkeiten, dies zu korrigieren.

Methode 1

  1. Klicken Sie mit der rechten Maustaste auf Ihr Storyboard> Öffnen als> Quellcode
  2. Suchen Sie in der geöffneten Storyboard-XML nach placeholder="YES".
  3. Sie finden Einschränkungen, die zur Laufzeit entfernt werden sollen. Entfernen Sie das Platzhalterattribut aus der Einschränkung, speichern und schließen Sie es.
  4. Führen Sie die App aus und Ihr Problem sollte behoben sein.

Methode 2

  1. Suchen Sie in Interface Builder nach der Einschränkung, die Ihre Probleme verursacht. Deaktivieren Sie die Option Platzhalter in der GUI. Dies sollte eine der Einschränkungen sein, die für ein IBOutlet im ViewController festgelegt sind, das Ihren Absturz verursacht.

Der Attributeditor des Interface Builder zeigt die aktivierte Option Platzhalter an.

So sollte es aussehen:

Der Interface Builder-Attributeditor zeigt die Option "Platzhalter" deaktiviert an.

Alternative

Angenommen, Sie möchten tatsächlich, dass die Einschränkung ein Platzhalter ist, müssen Sie alle referenzierenden Steckdosen entfernen. Wählen Sie dazu die Einschränkung aus, die Sie als Platzhalter verwenden möchten. Öffnen Sie dann den Verbindungsinspektor (die Schaltfläche ganz rechts, die wie folgt aussieht: (->)) und entfernen Sie alle Referenzierungssteckdosen, die möglicherweise für diese Einschränkung vorhanden sind.

Sandy Chapman
quelle
1
Was ist, wenn die Einschränkung ein Platzhalter sein soll? developer.apple.com/library/ios/documentation/UserExperience/…
Daniel Galasko
2
@DanielGalasko Wenn Sie möchten, dass es sich um einen Platzhalter handelt, weisen Sie ihn keinem IBOutlet zu.
Sandy Chapman
@ SandyChapman Das macht Sinn! Vielen Dank Sandy, könnten Sie das in Ihre Antwort aufnehmen, damit ich abstimmen kann?
Daniel Galasko
1
@ DanielGalasko, sicher. Es ist ein guter Punkt, meine Antwort war die Annahme, dass Sie die Einschränkung für ein IBOutlet wollten.
Sandy Chapman
@ SandyChapman: Gibt es eine Möglichkeit herauszufinden, welche Einschränkung dies verursacht? Mein Projekt ist zu groß, um jedes einzelne durchlaufen zu können, und der Stapelspeicherauszug zeigt nicht genau an, welche Einschränkung vorliegt. Außerdem habe ich versucht, nach placeholder = "YES" zu suchen, konnte aber keine in der XML finden.
EmbCoder
6

Ich hatte gerade das gleiche Problem und das Folgende funktionierte für mich.

Ich habe eine funktionierende Version meiner App im App Store veröffentlicht und einige Tage später wieder daran gearbeitet, indem ich auf eine meiner Registerkarten im UITabBarController getippt habe, die mit dem Fehler abgestürzt ist:

Terminating app due to uncaught exception 'NSInvalidUnarchiveOperationException', reason: 'Could not instantiate class named IBNSLayoutConstraint'

Ich hatte keine mir bekannten Platzhalter-Layout-Einschränkungen oder Einschränkungen für Outlets, die nicht definiert werden sollten.

Die Lösung für mich bestand darin, Größenklassen einfach auszuschalten und Größenklassendaten für das iPhone beizubehalten (App ist nur für iPhone). Dies muss alles gelöscht haben, was ich in den Größenklassen verpasst hatte. Ich möchte Größenklassen, also habe ich sie wieder aktiviert und die App hat einfach wieder funktioniert.

Philip Moore
quelle
Vielen Dank für Ihren Beitrag! Ich habe gerade das Gleiche erlebt und nichts an meiner App geändert. In meinem Fall stürzte es beim Laden eines 'UIPageViewController' ab. Das Deaktivieren und erneutes Beschriften von Größenklassen hat den Fehler behoben.
Nor0x
Vielen Dank!! Gleiche Erfahrung wie nor0x. Sehr seltsam, aber sehr wunderbar, hier die Lösung zu finden.
Andy Weinstein
4

Dies ist möglicherweise nicht unbedingt ein Einschränkungsproblem. Für mich wurde dies dadurch verursacht, dass "Installiert" nicht für eine Größenklasse aktiviert wurde, die für mein Layout gilt (siehe hier)Installation muss überprüft werden

abinop
quelle
1

Es gab einige Probleme bei der Verwendung von Größenklassen. Ich habe diese Option in den Storyboard-Eigenschaften deaktiviert und verwende nur das automatische Layout. Es war kein so großes Problem, da die App nur das iPhone ist.

zbrox
quelle
Das Deaktivieren der "Größenklassen" und das Ausführen haben dies auch für mich behoben. Ich habe dann die Größenklassen wieder aktiviert und es hat weiter funktioniert.
John Fowler
1

Was mir letztendlich passiert ist, dass ich eine Unteransicht in Interface Builder ausgeschnitten habe, um sie in eine andere xib zu kopieren. Dadurch wurde die Unteransicht im ursprünglichen xib Interface Builder ausgegraut. Nach dem Entfernen der Unteransicht von ihrem ursprünglichen Ort (durch Auswählen und Löschen). Ich konnte den Fehler beseitigen.

wilforeal
quelle
0

Es gibt eine Option im Inspektorfenster, wenn Sie die XIB-Datei auswählen, die die Einschränkungen unter "Datei als Inspektor anzeigen" im Inspektor mit dem Namen "Autolayout verwenden" nicht verwendet.

iPatel
quelle
Ich weiß davon, aber ich möchte Autolayout für dieses Storyboard verwenden.
Zbrox
Vielen Dank. Ich habe versucht, damit herumzuspielen, aber es hat nicht wirklich geholfen, da ich auch Größenklassen verwendet habe. Aber ich werde das durchlesen und sehen, ob ich etwas verpasst habe. Danke noch einmal.
Zbrox
0

Ich habe eine Änderung an einer Bildlaufansicht vorgenommen, damit die darin eingebetteten Auswahlsteuerelemente mit einer Lösung, die ich an anderer Stelle in Stackoverflow gefunden habe, ordnungsgemäß funktionieren. Mein neues Storyboard fügte diese Attribute einfach der Bildlaufansicht hinzu, was mir in Ordnung erschien.

     delaysContentTouches="NO" canCancelContentTouches="NO"

Außerdem habe ich in meinem Storyboard in einer anderen Szene das folgende neue Fragment gesehen:

                    <variation key="default">
                        <mask key="subviews">
                            <exclude reference="86H-aM-wei"/>
                        </mask>
                    </variation>

Ich habe keine Ahnung, woher es kam. Zuerst ignorierte ich es, weil alles auf meiner Entwicklungsmaschine zu funktionieren schien. Aber als der Build als Release erstellt und getestet wurde, bekam ich den Absturz. Das Entfernen dieses falschen (?) Fragments hat den Absturz behoben und scheint nichts anderes zu beeinflussen.

Andy Weinstein
quelle
0

Ich hatte dieses Problem, als ich eine Schaltfläche in einer benutzerdefinierten UICollectionViewCell hatte und einige ihrer Einschränkungen als IBOutlets für diese Klasse hatte. Ich habe die Schaltfläche von der Zelle in den übergeordneten Ansichts-Controller verschoben, und die IBOutlets wurden immer noch in der Zelle referenziert, waren jedoch in der Zelle nicht vorhanden, sodass alles in die Luft gesprengt wurde. Musste nur diese IBOutlets entfernen und alles hat wieder gut funktioniert!

CMash
quelle