Xcode 6 Fehler: Unbekannte Klasse in der Interface Builder-Datei

600

Ich habe ein Upgrade auf Xcode 6 Beta 4 durchgeführt und jetzt stürzt meine App ständig mit der Nachricht ab

Unbekannte Klasse X in der Interface Builder-Datei.

Es stürzt ab, weil Xcode angeblich meine benutzerdefinierten Klassen, die ich in meinem Storyboard verknüpft habe, nicht finden kann, aber es zeigt, dass sie in der Xcode-Oberfläche korrekt verknüpft sind.

Ich bin mir sicher, dass alles richtig verknüpft ist. Meine einzige andere Möglichkeit besteht darin, die gesamte Storyboard-Datei zu löschen und von vorne zu beginnen, da sie möglicherweise irgendwie beschädigt ist.

Bearbeiten: Ich möchte auch hinzufügen, dass ich versucht habe zu reinigen, den Simulator zurückzusetzen, mit Build-Phasen herumzuspielen usw. Nichts davon funktioniert.

Episches Byte
quelle
Mögliches Duplikat von stackoverflow.com/questions/3416269/…
Bouke
1
@ ImreKelényi Du hast recht. Dies ist mir kürzlich wieder passiert, nachdem ich das getan habe, was Sie gerade beschrieben haben.
Epic Byte
Dies funktionierte für mich, stackoverflow.com/questions/1725881/…
vrunoa
Es war ein Tippfehler für mich, debuggen Sie es mit dem Control-Element, bis, wenn es kommt, wählen Sie; View Controller> Identitätsinspektor> Benutzerdefinierte Klasse> Klasse. Löschen Sie das, wenn diese Klasse nicht definiert ist.
Außenseiter
9
BITTE BEACHTEN SIE! Dieser "Fehler" kann auf unterschiedliche Ursachen zurückzuführen sein. Wenn die akzeptierte Antwort für Sie nicht funktioniert, gehen Sie nach unten und versuchen Sie die nächste Antwort. Die richtige Antwort für meine Situation war die 5. Antwort.
Jacksonkr

Antworten:

1454

Ich habe dieses Problem behoben, als ich die Frage eingegeben habe. Ich dachte, ich würde meine Frage beantworten und sie hier allen anderen überlassen, die bei der Verwendung von Xcode 6 Beta 4 auf dieses Problem stoßen könnten.

Um dieses Problem zu beheben, müssen Sie jedes Ihrer benutzerdefinierten Klassenobjekte in Storyboard auswählen (dies schließt alle benutzerdefinierten Ansichten ein, auch die benutzerdefinierten Ansichtscontroller selbst).

Öffnen Sie dann mit diesen ausgewählten Objekten den Identitätsinspektor und unter "Benutzerdefinierte Klasse" sollte die Option Modul angezeigt werden. Klicken Sie in das Textfeld Modul und drücken Sie die Eingabetaste.

Das ist es! Das aktuelle Modul für alle meine benutzerdefinierten Objekte muss in Xcode 6 Beta 4 intern irgendwie falsch eingestellt worden sein. Im Inspektor gab es jedoch keinen visuellen Hinweis darauf.

Beachten Sie, dass wenn die Eingabetaste im Textfeld Modul nicht funktioniert, versuchen Sie, den Pfeil nach rechts auszuwählen und Ihr aktuelles Modul manuell auszuwählen. Deaktivieren Sie dann das Textfeld und drücken Sie die Eingabetaste. Sie können auch versuchen, die Eingabetaste im Klassentextfeld zu drücken (obwohl dies normalerweise dazu dient, ein anderes Problem zu beheben).

Hier ist ein Bild, um die Dinge klarer zu machen: enter image description here

Episches Byte
quelle
70
Für mich hat das Klicken in "Modul" und das Drücken der Eingabetaste nicht konsistent funktioniert, aber das Auswählen des Felds "Klasse" (und das Drücken der Eingabetaste) hat immer funktioniert.
Imre Kelényi
2
Für mich war das Ziel richtig eingestellt, aber die Klasse wurde immer noch nicht in IB angezeigt. Ich bemerkte jedoch, dass der "Speicherort" der Datei einen Pfad "Relativ zum Projekt" anstelle von "Relativ zur Gruppe" zeigte. Das Entfernen der Dateireferenz UND der Gruppe und das erneute Hinzufügen im Projektstamm hat bei mir funktioniert.
Knl
8
Beeindruckend. Danke dafür, ich glaube nicht, dass ich sonst dort angekommen wäre. Dies behebt ein Problem, das auftrat, nachdem ich @objc(...)eine meiner Swift-Klassen hinzugefügt hatte .
ndbroadbent
12
Dieses Problem ist in XCode 7.2 weiterhin vorhanden. Diese Lösung hat funktioniert.
Tom Fast
3
Dies ist immer noch ein Problem in Xcode 8.3.1 ... so eine Schande
Sepehr Behroozi
99

Manchmal fehlte Xcode customModule="AppName" customModuleProvider="target"

Um das Problem zu beheben, öffnen Sie das Storyboard als Quellcode und ersetzen Sie diese Zeile:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
sceneMemberID="viewController">

dazu:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass"
 customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">
ChikabuZ
quelle
7
Eigentlich musste ich in meinem Fall entfernen customModuleProvider, dann ging der Fehler weg.
Maciej Swic
3
Guillermo, noch Ende März in Xcode!
Ed Manners
3
@MaciejSwic Das Entfernen hat das customModuleProviderauch für mich getan, danke!
Sakiboy
1
Was ist mit XIB-Dateien?
SleepsOnNewspapers
7
Es passiert immer noch ... es sind Dinge wie diese, die mich zum Weinen bringen :(
Luke
72

Ich hatte dieses Problem, nachdem ich eine schnelle Klasse umbenannt hatte. Es wurde mithilfe der @ objc-Direktive gelöst:

@objc(ForumTopicListViewController) class ForumTopicListViewController
user1760527
quelle
4
Das hat es für mich behoben, ich hatte @objc class Xund wechselte zu @objc(X) class Xarbeiten.
Joe
1
Sie können auch versuchen, Ihre abgeleiteten Daten zu löschen, siehe stackoverflow.com/questions/24039932/…
user1760527
Hatte dieses Problem nach dem Umbenennen der Standard-ViewController-Klasse aus der Single View-Projektvorlage. Ich frage mich, welche Magie verwendet wurde, damit die @objc()Direktive für die 'ursprüngliche' ViewController-Klasse nicht benötigt wurde ...
Berend Klein Haneveld
Ich gehe auf die andere Seite. Ich hatte den Modulnamen in der Storyboard-Datei angegeben, aber auch die Anweisung @objc hinzugefügt.
WeZZard
1
Hat bei mir NICHT funktioniert. :( Weder funktioniert die Lösung des Modulnamens.
mythicalcoder
64

Projekt mit mehreren Zielen

In meinem Fall arbeite ich an einem Projekt mit mehreren Zielen und das Problem "Von Ziel erben" wurde deaktiviert. Die Auswahl von "Vom Ziel erben" löste mein Problem

Geben Sie hier die Bildbeschreibung ein

Muhammad Nayab
quelle
Vielen Dank für die Veröffentlichung. Das Problem, das ich sah, wurde sehr schnell gelöst.
JaredH
Ich hatte eine ähnliche Situation. (XCode 9.4.1) Ich habe eine iOS-App namens FilesTestA mit einer benutzerdefinierten UIView namens MxFileView (bestehend aus MxFileView.swift und MxFileView.xib) erstellt. Dann habe ich ein weiteres Ziel hinzugefügt: ein Heute-Widget ("FilesTestAWidget"). Lösung für die Verwendung von MxFileView im Widget: (1) class = "MxFileView"; (2) Aktivieren Sie "Modul vom Ziel erben" (oder deaktivieren Sie es und geben Sie "FilesTestAWidget" manuell ein). (3) Stellen Sie im App-Ziel sicher, dass sowohl MxFileView.swift als auch MxFileView.xib FilesTestAWidget in ihre Zielmitgliedschaft aufnehmen.
Kenster999
Dies ist mir bei einem neuen Projekt aus der Standardvorlage in Xcode 10.1 passiert (ein einzelnes iOS-App-Ziel und zwei Testziele). Das Kontrollkästchen wurde für alle meine benutzerdefinierten Ansichts-Controller deaktiviert (daher lautete der Platzhaltertext "Keine"). Nachdem Sie das Kontrollkästchen für jeden benutzerdefinierten Ansichts-Controller in meinem Storyboard aktiviert hatten, wurde das Problem behoben.
Mason
58

Das hat bei mir funktioniert ..

Überprüfen Sie Ihre kompilierte Quelle, ob diese Datei (z. B. ViewController.m) hinzugefügt wurde oder nicht. In meinem Fall wurde die ViewController-Datei nicht hinzugefügt, sodass mir der Fehler angezeigt wurde.

Geben Sie hier die Bildbeschreibung ein

Außenseiter
quelle
@CarmenA Sie fügen immer nur '.m'-Dateien hinzu Compile Sources. Dies ist wirklich die richtige (und einzige) Lösung für einige.
Jacksonkr
Ich habe einige der anderen Lösungen ohne Glück ausprobiert. Das hat den Trick gemacht. Aus irgendeinem Grund fehlte einem Ziel die eine Quelldatei, die mir passt.
Galactikuh
für mich auch ..
Geschehen
46

Dies kann in jedem Xcode über 6.0 passieren. Es ist mir passiert, nachdem ich einige ViewController-Klassen im Swift-Projekt umbenannt habe (aber ich denke, es wird auch mit Obj-C passieren). Sie müssen nur den Interface Builder öffnen, zum Identitätsinspektor von ViewController gehen, dessen Klasse umbenannt wurde, Klasse auswählen und die Eingabetaste drücken. Dadurch wird die umbenannte Klasse dem ausgewählten ViewController neu zugewiesen und der Modulwert zurückgesetzt, der nach dem Umbenennen der Klasse verloren geht.

Update für Xcode 8.1 (wahrscheinlich auch 8.0):

Xcode 8.1 stürzt einfach ab. Einfach und nervig stürzt einfach ab und druckt nichts. Ich habe diesen Phantomabsturz eine Stunde lang verfolgt, nur um herauszufinden, dass es genau dasselbe war - nicht zugewiesene Klasse in IB. Wenn es zu Phantomabstürzen kommt, überprüfen Sie IB zuerst auf nicht zugewiesene Klassen.

jovanjovanovic
quelle
Danke dafür. Es scheint, dass Xcode nach Ihrem Vorschlag das Modul (unter der Klasse in IB) von None auf Current aktualisiert. Ich denke, das Problem ist, dass die einfache Eingabe des Namens ohne Eingabe nicht eine Modulaktualisierung durch Xcode auslöst.
RockiesGrizzly
Das hat bei mir funktioniert. Ich habe versehentlich eine Controller-Klasse umbenannt, sodass sie beim Laden des View-Controllers offensichtlich nicht mehr vorhanden war.
Litehouse
32

Manchmal verliert der von Ihnen bereitgestellte Controller seine Zielmitgliedschaft aus der aktuellen Anwendung. In diesem Fall führt das Drücken der Eingabetaste im Feld "Modul" zu nichts. Gehen Sie zum Controller und stellen Sie sicher, dass für die aktuelle App die Zielmitgliedschaft festgelegt ist.

Furqan Khan
quelle
Dies war auch für mich das Problem - mehrere Ziele führen dazu, dass die Klassendatei versehentlich nicht in dem Ziel enthalten ist, das ich erstellt habe.
Ryan Kreager
Ich habe Dateien zusammengeführt und vermisse dies in einem meiner Ziele, großartige Antwort
Benjamin Jimenez
Gut, Merge pbx hat die Zielmitgliedschaftswerte gebrochen.
System
32

Für die Aktivierung wurde Inherit Module From Targetdas richtige Zielmodul verwendet. Das hat das Problem gelöst.

Geben Sie hier die Bildbeschreibung ein

Arnab
quelle
Bestätigen. Dies hat mir geholfen, das Problem zu lösen.
Chris8447
Normalerweise tritt dieses Problem auf, wenn ich einen View Controller von Objective-C nach Swift konvertiere. Ich tippe den letzten Buchstaben erneut ein und drücke die Eingabetaste. Sollte auch den Trick machen.
DevNebulae
30

Meine Antwort: Setzen Sie das benutzerdefinierte Modul gleich dem benutzerdefinierten Pod-Namen (in meinem Beispiel - benutzerdefinierter Klassenname) wie im beigefügten Screenshot

Diese Lösung ist für einen bestimmten Fall vorgesehen : für benutzerdefinierte Ansichtsklassen aus Pod (oder Karthago) ) Framework.

Infrastruktur: XCode8, Swift3

Geben Sie hier die Bildbeschreibung ein

Tamara
quelle
18

Ich habe es behoben, indem ich genau das Gegenteil von dem getan habe, was ChikabuZ vorgeschlagen hat (danke, dass Sie darauf hingewiesen haben). Suchen Sie in der Storyboard-Datei Folgendes:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" customModule="AppName" customModuleProvider="target" sceneMemberID="viewController">

und ersetzen Sie es durch:

<viewController storyboardIdentifier="StoryboardId" id="SomeID" customClass="CustomClass" sceneMemberID="viewController">

Ich kann nicht glauben, wie viele Stunden ich verliere, um Fehler im Swift-Compiler und in Xcode 6 zu umgehen

Orlin Georgiev
quelle
17

Durch Auswahl der richtigen Lösung Modulehabe Custom Classich dieses Problem gelöst.

Hier ist es :

Geben Sie hier die Bildbeschreibung ein

Roy
quelle
13

Ich hatte dieses Problem in Xcode 8 , um es zu beheben, musste ich das Storyboard im Texteditor ändern.

Im Allgemeinen sieht für Ihre Steuerung und entfernen customModuleund customModuleProvidervon der Steuereinheit.

Hat einen Trick für mich gemacht.

George Maisuradze
quelle
Hah! Netter Hack :)
Vexy
10

Ich hatte das gleiche Problem.

In meinem Fall hat Xcode meine benutzerdefinierte Klasse nicht hinzugefügt zu: Ziel> Erstellungsphase> Quellen kompilieren.

Ich empfehle Ihnen daher zu überprüfen, ob Ihre CustomClass.m vorhanden ist.

Geben Sie hier die Bildbeschreibung ein

Ich hoffe das hilft dir.

rcmstark
quelle
Das ist mir passiert und hat zum Glück meinen Ausweg gefunden! Ich kam hierher, um zu antworten, aber du warst der Erste. Vielen Dank!!!
Gabriel Piffaretti
9

Dieses Problem trat in Xcode 6.1 auf, als ich Main.storyboarddie LaunchScreen.xibDatei und die Standardklassen ViewControlleraus meinem Projekt entfernte.

Ich habe es behoben, indem ich die Launch Screen Fileund Main InterfaceEinträge aus gelöscht habeInfo.plist

Vinay Jain
quelle
9

Überprüfen Sie, ob Ihre Klasse die richtige Zielmitgliedschaft hat .

Jakub Truhlář
quelle
8

Ich habe überall dafür gegoogelt. Keine der Antworten funktioniert für mich, bis ich einen Typen getroffen habe, der mich gebeten hat, meinen Projektordner auf den Desktop zu verschieben. Es hat einfach automatisch funktioniert. Anscheinend bricht XCODE tatsächlich ab, wenn Sie Ihren Projektordner zu tief in vielen Ordnern haben.

VBaarathi
quelle
Ich habe dieses Problem in Xcode 7 Beta 5 erneut erhalten, da ich es zuvor in Xcode 6 erhalten habe. Dieses Mal funktioniert diese Methode für mich.
Jake Lin
1
Im Visual Studio gibt es ein ähnliches Problem. Aber dort drüben erhalten wir eine klare Warnmeldung, dass der Pfad zu lang ist und Dinge nicht hinzugefügt oder bearbeitet werden können. Ich bin mir nicht sicher, ob es mit XCODE dasselbe ist, aber nach dieser Episode behalte ich alle meine Projekte entweder in Dokumenten oder auf dem Desktop und hatte dieses Problem nie wieder. Ich habe diesen Rat sogar jemandem gegeben, der Xamarin Studio verwendet, und er hat auch für ihn funktioniert ...
VBaarathi
7

Diese Schritte funktionieren für mich.

1) Abgeleitete Daten löschen.
2) Entfernen Sie die Dateien .h und .m.
3) Erstellen Sie erneut die Dateien .h und .m

ARWIN
quelle
Das hat auch bei mir funktioniert. Ich habe es sogar zum Laufen gebracht, ohne abgeleitete Daten zu löschen.
Jaytrixz
Dies wurde für mich gearbeitet, vielen Dank Arwin, aber ich verstehe immer noch nicht, warum es einen solchen Fehler
auslöst,
7

Ich habe dieses Problem gelöst, indem ich meine Storyboard-Datei als Quellcode geöffnet und mit Befehl-F nach meiner unbekannten Klasse gesucht und die damit verbundene benutzerdefinierte Klasse gelöscht habe.

Wraithseeker
quelle
6

Was @gfrs gesagt hat, ist richtig. Sie müssen das Modul einstellen. Ich bin jedoch einmal auf ein Problem gestoßen, bei dem meine Klasse nicht in der Liste aufgeführt warClass gestoßen Dropdown-Liste aufgeführt war. Schließlich entfernte ich die schnelle Datei, startete Xcode neu und erstellte die Datei neu. Schließlich wurde die Klasse aufgelistet und konnte im Storyboard verwendet werden.

Schauen Sie sich auch diese Antwort an , die das "echte" Problem zu lösen scheint , auf das ich gestoßen bin.

Bouke
quelle
Das Entfernen und erneute Hinzufügen einer Klassendatei hat bei mir funktioniert. Vielen Dank!
Nicolas Miari
6

Ich habe dieses Problem gelöst, indem ich den Modulnamen (in der Dropdown-Liste wird leider nichts angezeigt ...) in die benutzerdefinierte Klasse des Identitätsinspektors für alle View-Controller und -Ansichten eingegeben habe.

Möglicherweise müssen Sie auch den Zielanbieter angeben. Um dieses Ziel zu erreichen, können Sie das Storyboard im Quellcode-Modus öffnen und das Attribut "customModuleProvider" sowohl in ViewController- als auch in View-spitzen Klammern hinzufügen.

Teng Long
quelle
6

Meine Lösung (Xcode 8.1 Swift 3.0):

Unbekannte Klasse xxx in der Interface Builder-Datei.

Öffnen Sie StoryBoard als Quellcode und suchen Sie nach xxx . Entfernen Sie das Attribut, das den Wert xxx enthält . Erstellen und ausführen.

ibrahimyilmaz
quelle
WTF? Das war absolut notwendig für mich, danke. Ich musste dencustomModule="" customModuleProvider=""
Dan Rosenstark
1
Wenn wir versuchen, eine Anwendung im App Store zu veröffentlichen, die einen solchen Fehler enthält, wird die Anwendung ohne nachzudenken abgelehnt.
Ibrahimyilmaz
Ich stimme dir nicht zu. Ich habe gerade einen Build eingereicht, den ich auf diese Weise an TestFlight ändern musste, und er ist bereit für den Beta-Test ... wir werden sehen, was im eigentlichen App Store passiert, aber es ist ein IB-Fehler IMO. Vielen Dank!
Dan Rosenstark
4

In meinem Fall habe ich eine Flagge -ObjCzu Other Linker Flagsin Projekteinstellungen , damit es funktioniert. Auch ich habe es mit -all_loadFlagge versucht und es hat auch gut funktioniert.

Geben Sie hier die Bildbeschreibung ein

Rostyslav Druzhchenko
quelle
3

In meinem Fall die Klasse in der Storyboard / xib verwiesen hat kein Ziel Membership - Set.

Geben Sie diesen Klassen .hund .mDateien zur Behebung dieselbe Zielmitgliedschaft wie Ihren anderen Klassen.

Keine Zielmitgliedschaft festgelegt.

pkamb
quelle
Dies war mein Problem, aber beim Ausprobieren verschiedener Lösungen verursachte ich das Problem, das durch die Antwort von Epic Byte behoben wurde. Sie müssen Ihren Quellcode in dem Ziel haben, das Sie erstellen, aber auch in IB müssen Sie den View Controller so einstellen, dass er Teil des aktuellen Ziels ist.
SafeFastExpressive
Die Zielmitgliedschaft war auch mein Problem, sah überall aus, aber dank dieser Antwort konnte ich es lösen.
Borzh
3

Meine Lösung bestand darin, @objc aus der benutzerdefinierten Klassendefinition zu entfernen.

DenisKirillov
quelle
2
Ein Beispiel mit Erklärung wäre toll.
Nilambar Sharma
2

Ich hatte das Problem, als ich das Storyboard vom Swift-Projekt zum Objective-c-Projekt portierte und dabei die Antwort von vvkuznetsov bemerkte . Es stellte sich heraus, dass beide Projekte denselben Bezeichner verwendeten. I "Produkt -> Reinigen" und tippen Sie im Textfeld Modul und Klasse auf die Eingabetaste. Das Problem ging weg.

xhg
quelle
2

Ich habe dies in Anlehnung an Laura behoben, aber ich musste die Dateien nicht neu erstellen.

Wählen Sie mit XCode 4 im Projektnavigator die .m-Datei aus, die die Klasse enthält, über die sie sich beschwert

Gehen Sie zu Ansicht-> Dienstprogramme-> Dateiinspektor anzeigen (hiermit wird rechts der Dateiinspektor mit den Informationen zur .m-Datei angezeigt.)

Öffnen Sie den Abschnitt Zielmitgliedschaft und stellen Sie sicher, dass Ihr Ziel für diese .m-Datei ausgewählt ist

Als ich meine .m-Datei zu meinem Projekt hinzufügte, wurde sie aus irgendeinem Grund nicht zu meinem Standardziel hinzugefügt, und dies führte dazu, dass ich den von Ihnen erwähnten Fehler erhielt.

Jignesh Kalantri
quelle
2

Mein Problem war ein Benutzerfehler. Ich hatte ein generisches UIView in meinem Storyboard und im Abschnitt Benutzerdefinierte Klasse des Identitätsinspektors hatte ich versehentlich den Namen von UIView in Kauderwelsch geändert.

Um dies zu beheben, musste es nur wieder in UIView geändert werden.

Roller
quelle
Ich habe das Gleiche getan, aber versehentlich den Namen Custom View Controllers zum Abschnitt Custom Class der ViewControllers-Stammansicht hinzugefügt. Ich wollte also herausfinden, warum View Controller nicht gefunden werden konnte, wenn es sich die ganze Zeit um die Stammansicht handelte.
Am
1

Was nur für mich funktioniert hat, ist das Hinzufügen des Modulnamens zur xib-Datei ...

Sooo, die xib-Dateien sehen folgendermaßen aus:

mymodule.MyViewController.xib (Module being the name of the proyect, usually)

HORRIBLE Lösung meiner Meinung nach, aber Apple will angeblich, dass wir das jetzt tun.

Diese Frage zeigt 3 mögliche Problemumgehungen in Beta 4 ... anscheinend war Apple in dieser Situation laut einigen nicht sehr hilfreich, weil sie es "Arbeiten wie beabsichtigt" nennen.

Sch
quelle
1

Ich hatte das gleiche Problem mit Xcode Version 6.1 (6A1052d). Ich denke, das Problem tritt auf, wenn Sie Ihr App / Xcode-Projekt umbenannt haben.

Meine Lösung bestand darin, den Modulnamen manuell im Interface Builder hinzuzufügen.

patrickS
quelle
1

Ich hatte dieses Problem, nachdem ich ein neues Ziel hinzugefügt und dann eine neue Klasse im Dialogfeld "Neue Datei" erstellt hatte, konnte jedoch versehentlich das neue Ziel sowie das ursprüngliche Ziel im Erstellungsdialog nicht überprüfen, sodass das Objekt nur zu meinem hinzugefügt wurde ursprüngliches Ziel. Die Lösung bestand darin, die Quelldateien zu löschen (nur Verweise entfernen) und sie dann mithilfe von "Dateien hinzufügen" wieder hinzuzufügen. Diesmal wurden beide Ziele überprüft.

JulianSymes
quelle