Fehler "Unbekannte Klasse <MyClass> in Interface Builder-Datei" zur Laufzeit


260

Obwohl Interface Builder a kennt MyClass, wird beim Starten der Anwendung eine Fehlermeldung angezeigt.

Dies geschieht, wenn MyClasses Teil einer Bibliothek ist, und nicht, wenn ich die Klasse direkt im Anwendungsziel kompiliere.


Wie verlinkst du zur Bibliothek?
Elise van Looij

Ich verwende ein abhängiges Teilprojekt und habe die Produkte des Xcode-Teilprojekts per Drag & Drop in die Erstellungsphase "Link Binary With Library" meines aktuellen Ziels verschoben.
jhoule

Wenn die Klasse von CocoaPods stammt, kann dies github.com/CocoaPods/CocoaPods/issues/491 helfen .
Protocole

Antworten:


222

Trotz des zur Laufzeit gedruckten Fehlers " Unbekannte Klasse MyClass in Interface Builder-Datei " hat dieses Problem nichts mit Interface Builder zu tun, sondern mit dem Linker, der keine Klasse verknüpft, da kein Code sie direkt verwendet.

Wenn die aus der .xib kompilierten .nib-Daten zur Laufzeit geladen werden, MyClasswird mit einer Zeichenfolge auf sie verwiesen, aber der Linker analysiert nicht die Codefunktionalität , sondern nur die Codeexistenz , sodass er das nicht weiß. Da keine anderen Quelldateien auf diese Klasse verweisen, optimiert der Linker sie, wenn die ausführbare Datei erstellt wird. Wenn Apples Code versucht, eine solche Klasse zu laden, kann er den damit verbundenen Code nicht finden und gibt die Warnung aus.

Standardmäßig sind für Objective-C-Ziele -all_load -ObjCstandardmäßig Flags gesetzt, die alle Symbole beibehalten. Aber ich hatte mit einem C ++ - Ziel begonnen und hatte das nicht. Trotzdem habe ich einen Weg gefunden, der den Linker aggressiv hält.

Der Hack, den ich ursprünglich verwendete, bestand darin, eine leere statische Routine hinzuzufügen, wie:

+(void)_keepAtLinkTime;

was nichts tut, als dass ich einmal anrufen würde, wie zum Beispiel:

int main( int argc, char** argv )
{
   [MyClass _keepAtLinkTime];
   // Your code.
}

Dies würde den Linker zwingen, die gesamte Klasse zu behalten, und der Fehler verschwindet.

Wie jlstrecker in den Kommentaren betonte, müssen wir keine _keepAtLinkTimeMethode hinzufügen . Rufen Sie einfach eine vorhandene auf, z.

   [MyClass class];

macht den Trick (solange Sie von einem ableiten NSObject).

Natürlich können Sie dies an jedem Ort Ihres Codes aufrufen. Ich denke, es könnte sogar in nicht erreichbarem Code sein. Die Idee ist, den Linker zum Denken zu verleiten, MyClassdas irgendwo verwendet wird, damit es nicht so aggressiv bei der Optimierung ist.

Xcode 6.3.2 & Swift 1.2

Schnelle Definition der Ansicht. Achten Sie darauf, zu überschreiben init(coder aDecoder: NSCoder). Ziel-C-Definition des View Controllers. Und eine Feder in einem Birnbaum.

Fügen Sie den Modulnamen zum Nib-Detailinspektor hinzu, in dem Sie Ihre Klasse auswählen.


2
Die .xib-Daten werden zur Laufzeit nicht geladen. Der IB-Compiler kompiliert die xib zu einer Feder; Die Feder wird zur Laufzeit geladen.
Peter Hosey

19
Sie müssen nicht ändern MyClass. Rufen Sie einfach eine Methode auf, von der es erbt NSObject, wie z +class.
Jlstrecker

10
Obwohl es kein Xcode 4 war, als die ursprüngliche Frage gestellt wurde, scheint das Folgende dennoch angemessen zu sein. In Xcode 4 können Sie anstelle einer Dummy-Methode zur Beseitigung des Fehlers alle erforderlichen Ziele MyClass.mim Abschnitt Zielmitgliedschaft des Dateiinspektors überprüfen .
Adubr

51
Eine andere Möglichkeit besteht heutzutage darin, dass sich MyClass.m möglicherweise nicht in der Erstellungsphase von Compile Sources befindet. Dies kann passieren, wenn Sie MyClass.h / m in Ihr Projekt ziehen, anstatt sie mit der neuen Datei zu erstellen.
Steven Fisher

6
@JoshBruce Kannst du die Swift-Lösung erklären? Ich verstehe es nicht wirklich.
Ryan Bobrowski

183

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

  • Zum View-> Hilfsmittel-> Show File Inspector
    (dies wird die zeigen Datei - Inspektor auf der rechten Seite , mit dieser .m-Datei info)

  • Öffnen Sie die Ziel Mitgliedschaft Abschnitt und stellen Sie sicher , dass Ihr Ziel für diese .m-Datei ausgewählt

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.


Es ist wahr, dass der Linker-Fehler manchmal darauf zurückzuführen ist, dass Ihre Datei in Ihrem Ziel überhaupt nicht kompiliert wurde. Was Sie beschreiben, ist die Möglichkeit, die Ziele zu steuern, denen eine Datei zugeordnet ist. Leider war meine Datei bereits Teil meines Ziels, aber ich hatte immer noch ein Linkproblem. Dies lag wahrscheinlich daran, dass meine Bibliothek C ++ (im Gegensatz zu Objective-C) ist und unterschiedliche Standard-Linker-Flags hat (siehe Beiträge von Alasdair Allan und Sijo oben).
Jhoule

5
Dieser Vorschlag hat bei mir funktioniert, wenn auch etwas anders, da mein Kontrollkästchen "Zielmitgliedschaft" bereits aktiviert war. Ich habe es deaktiviert und neu erstellt, aber dann hat sich die Fehlermeldung geändert, um meinen neuen Klassennamen anzugeben. Wenn Sie das Kontrollkästchen erneut aktivieren und erneut erstellen, funktioniert jetzt alles. Viel einfacher als das Löschen von Cache-Dateien!
Elektromaggot

Tolle Lösung über die Xcode-Benutzeroberfläche. @electromaggot, Xcode kann verwirrt sein, wenn Sie Klassen manuell hinzufügen. Daher müssen Sie möglicherweise mehr als eine Datei hinzufügen.
Gonen

Dies ist auch für mich eine Lösung. Ich hatte einige Klassendateien aus einem anderen Projekt hineingezogen, und diese Klassendateien waren diejenigen, die die Ausnahme auslösten.
Hairbo

1
Ich habe eine Datei aus meinem Projekt gelöscht und diese später wieder hinzugefügt, wodurch das Problem behoben wurde.
MindSpiker

70

Dies hat eigentlich nichts mit Interface Builder zu tun. Was hier passiert, ist, dass die Symbole nicht von Xcode aus Ihrer statischen Bibliothek geladen werden. Um dieses Problem zu beheben, müssen Sie -all_load -ObjCdem Other Linker FlagsSchlüssel die Build-Einstellungen für das Projekt (und möglicherweise das Ziel) die Flags hinzufügen .

Da Objective-C nur ein Symbol pro Klasse generiert, müssen wir den Linker zwingen, auch die Mitglieder der Klasse mit dem Flag -ObjC zu laden, und wir müssen auch die Aufnahme aller unserer Objekte aus unserer statischen Bibliothek erzwingen, indem wir das -all_loadLinker-Flag hinzufügen . Wenn Sie diese Flags früher oder später überspringen, werden Sie auf den Fehler stoßen unrecognized selectoroder andere Ausnahmen erhalten, wie die hier beobachtete.


5
Ich fand, dass nur die -ObjCFlagge es in meinem Fall reparierte.
Kekoa

5
@Kekoa, das liegt daran, dass Ihre Version von Xcode (LLVM) aktueller ist als der Typ, der diese Antwort geschrieben hat. Heutzutage ist die Verwendung -ObjCgut genug, um das Problem zu beheben.
Bis zum

das hat mir nur geholfen. Während der Kompilierung wurden die erforderlichen Framework-bezogenen Probleme angezeigt, die auch behoben wurden, nachdem ich alle Frameworks importiert hatte.
Vaibhav Saran

-ObjC Flag allein hat mein Problem behoben. Ich habe tatsächlich einen Fehler erhalten, weil ich das Attribut all_load in iOS7 habe.
Sushma Satish

Die Verwendung von -all_load -ObjC kann zu einer unnötigen Erhöhung der Produktgröße führen. Dieses Problem tritt auch bei Kategoriedateien nur in Frameworks auf.
Ali Amin

26

Ich bin heute mit Swift auf dieses Problem gestoßen.

Ich habe eine Klasse Model.h + Model.min eine geändert Model.swift. Dieses Objekt wurde im Interface Builder mit dem verwendet class = Model.

Sobald ich das Objekt ersetzt habe, konnte die Klasse nicht mehr geladen werden.

Was ich tun musste, war die Klassenreferenz in IB zu ändern von:

Class = Model
Module = 

zu

Class = Model
Module = <TARGETNAME>

Sie finden die <TARGETNAME>in den Build-Einstellungen. Es ist auch der Name, der in Ihrem generierten Swift-Header angezeigt wird:#import "TARGETNAME-Swift.h"


1
Dies scheint die richtige Antwort zu sein. Sofern jemand nichts anderes sagen kann, sollte dies als korrekt markiert werden.
Bjørn Ruthberg

1
Tolle Antwort, danke. Für mich war der ModuleName genau dort in der Dropdown-Liste. Es war der Name meiner App.
ChrisH

Für mich geht das. Für mein Problem ist der in Ihrer Antwort erwähnte <TARGETNAME> der Name des Frameworks, der die Klasse enthält.
Tyler Long

Ich bin alleine zu dem Schluss gekommen, dass dies auch der Fehler war, den ich bekam, und war bereit, meine Ergebnisse zu veröffentlichen, als ich Ihren Beitrag sah. Ich habe es tatsächlich gesehen, bin aber daran vorbeigekommen, wegen der vielen Antworten und des Lärms. Ich denke, Ihre Antwort könnte durch einige Screenshots verbessert werden, um Ihre Antwort von den anderen zu unterscheiden. Ich würde es sicher fangen, wenn es so wäre. Trotzdem vielen Dank, dass Sie es hier gepostet haben. Du hast meine Gegenstimme bekommen.
Jvarela

Für das AppDelegate konnte ich dies in der Benutzeroberfläche des Interface Builder beheben. Für die benutzerdefinierte Klasse eines UI-Elements in einem Fenster konnte ich auf der Benutzeroberfläche des Interface Builder die benutzerdefinierte Klasse und das benutzerdefinierte Modul nicht festlegen. Ich musste Folgendes tun: (1) Öffnen Sie die .xib-Datei als "Quellcode" (klicken Sie mit der rechten Maustaste darauf). (2) Fügen Sie das Attribut "customModule = <TARGETNAME>" neben dem Attribut customClass hinzu.
Poulsbo

20

Gehen Sie zum "Projektnamen", klicken Sie darauf und gehen Sie dann zur Registerkarte "Build-Phasen", klicken Sie dann auf "Quellen kompilieren" und klicken Sie dann auf die Schaltfläche "+". Ein Fenster wird angezeigt. Wählen Sie "MyClass". m "Datei und klicken Sie dann auf" Hinzufügen ",

Erstellen Sie das Projekt und führen Sie es aus. Das Problem wird sicherlich gelöst


Ja, ich hatte nicht ALLE Zielfelder aktiviert, die ich meinen neu importierten Klassen hinzufügen wollte. Vielen Dank!
Joel Balmer

Ja! Meine VC-Datei fehlte im Zielprojekt.
Sebastian Dwornik

19

Es handelt sich um ein Xcode4-Cache-Problem. Löschen Sie einfach alle Ordner unter / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

Auch wenn Sie das gleiche Problem beim Testen Ihres iPhones haben, löschen Sie die alte App, bevor Sie sie ausführen ...

Viel Glück. Pascual


8
In den Projekterstellungseinstellungen müssen Sie die Flags "-all_load -ObjC" zum Schlüssel "Other Linker Flags" hinzufügen. Dies ist kein Xcode 4-spezifisches Problem und hat im Allgemeinen auch nichts mit Interface Builder zu tun.
Alasdair Allan

Diese Lösung wurde bereits im Januar 2010 vorgeschlagen (siehe oben).
Jhoule

6
Ja - der einfachere Weg, dies zu tun, ist einfach den iOS-Simulator zu öffnen und im Menü "Inhalt und Einstellungen
zurücksetzen" zu

Oder Sie können das tun, was ich getan habe, und einfach die betreffende App vom Simulator-Startbildschirm löschen. Ich hatte die gleiche Fehlermeldung, die jedoch auf einen alten App-Delegaten verwies.
Spstanley

16

Manchmal hat IBuilder gefehlt 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">

Wenn Sie Xcode 6.3 (6D570) verwenden, wird die Einstellung nach dem Ausführen auf die ursprüngliche (schlechte) Einstellung zurückgesetzt. Fehler? Ich versuche, eine schnelle Datei in ein Objective C-Projekt aufzunehmen.
Addzo

Unter XCode 6.4 wurde das Problem durch Hinzufügen von customModuleProvider = "target" im Storyboard-Quellcode unter dem gewünschten Viewcontroller behoben.
Amro Shafie

Ich konnte mein Problem mit just lösen customModule="MyFrameworkName". Riesige +10
Stan

Eigentlich war mein Problem das Gegenteil, ich wollte das CustomTaget löschen, aber Xcode änderte die xib-Quelldatei nicht. Also musste ich customModule = "AppName" customModuleProvider = "target" löschen, damit es funktioniert.
Adriana

14

Mein Fall - Beim Versuch, eine Klasse aus einem schnellen Framework in meinem Ziel-C-Projekt zu verwenden, ist dieser Fehler aufgetreten. Die Lösung bestand darin, das Modul (schnelles Framework) der Klasse in Interface Builder / Storyboard hinzuzufügen, wie unten gezeigt. Nichts anderes

Geben Sie hier die Bildbeschreibung ein


2
Ich verwende ein Swift-Framework in einem von CocoaPods installierten Swift-Projekt. Diese Methode funktioniert. Und der Modulname ist der Name des Frameworks.
JsW

1
Das funktioniert perfekt. Müssen Sie, warum dieses Modul entfernt wird?
iSrinivasan27

Funktioniert perfekt mit Problemen mit Cocoapod-Frameworks ... ein
großes Lob

13

Gehen Sie zu Build Phases-> Compile Sources und fügen Sie Ihre neuen .m-Dateien hinzu.


Ja, nachdem Sie neue Dateien aus einem früheren Projekt zu einem XCode 4.5-Projekt hinzugefügt haben, wurde das Hinzufügen der .m-Dateien zur Liste der Kompilierungsquellen mit Sicherheit erledigt. Das Hinzufügen von "-all_load -ObjC" hat in meinem Fall nicht funktioniert, hat aber nicht geschadet.
Whyoz

13

In meinem Fall zeigte es einen Fehler für eine Klasse, die nicht einmal existierte! Ich vermutete, dass es etwas war, das in der Storyboard-Datei verfälscht wurde. Wenn Sie die Klassendatei im Fehler nicht erkennen, versuchen Sie Folgendes:

1) Öffnen Sie Ihr Projekt in sublime oder einem anderen guten Editor. Suchen Sie nach der Klasse, auf die verwiesen wird. 2) Entfernen Sie das ganze Bit, das sagt

customClass="UnrecognizedClassName"

3) Speichern Sie es. 4) Kehren Sie zu xcode zurück, bereinigen Sie das Projekt und führen Sie es jetzt aus.

arbeitete für mich.

Geben Sie hier die Bildbeschreibung ein


Ich benutze die OSX TextEdit App. Für diese Operation hat es gut funktioniert. Stellen Sie sicher, dass Sie zuerst Ihr Projekt schließen und Xcode schließen.
TJ

Das hat auch geholfen. Ich hatte mehr als ein Objekt mit derselben benutzerdefinierten Klasse. Wahrscheinlich habe ich auf die Ansicht anstelle des Controllers geklickt und denselben Namen zugewiesen.
Mc-

1
Dies war auch die Lösung für das Problem, auf das ich gestoßen bin; Ich hatte zuvor einen Teilklassennamen eingegeben und irgendwie wurde das Storyboard auf diese Weise gespeichert (z customClass="MyCla". B. ). Anstatt die benutzerdefinierte Klassenzuweisung zu löschen, war es für mich
ratsam

9

Ich möchte diese Antwort nur hinzufügen, da die meisten, wenn nicht alle Antworten hier davon ausgehen, dass die Klasse tatsächlich existiert. Es ist nur so, dass der Linker / Compiler zu dumm ist, um sie zu sehen. Daher drehen sich die Antworten darum, den Linker entweder auf die Existenz aufmerksam zu machen der Klasse oder einen Hack zu "erzwingen" existieren es ..

Mein Problem tritt auf, wenn diese Nachricht tatsächlich von einer nicht existierenden Klasse spricht. Ein Beispiel wäre also, dass ich zu einer alten Git- Revision zurückkehre, die keine Kenntnis von einer bestimmten Klasse hat. Der Compiler beschwert sich jedoch, dass diese Klasse dies nicht tut. t existieren ..

Lösung?

  • Nuke die ganze Sache! Löschen Sie zuerst alle Build-Dateien usw., indem Sie alle Inhalte in diesem Verzeichnis löschen ~ / Library / Developer / Xcode / DerivedData
  • Löschen Sie die App vom Telefon selbst (und löschen Sie den Simulatorinhalt, wenn Sie einen Simulator verwenden).

du solltest gut sein, danach zu gehen


2
Ich kann dieses nicht genug +1, mein Problem wurde behoben. Mein Problem war genau das gleiche, bei dem die Datei bereits gelöscht wurde, die Warnung jedoch beim Kompilieren weiterhin angezeigt wurde.
Brett

Im Storyboard müssen Sie die Kennung eingeben. Manchmal schreibe ich es versehentlich in das Feld "Klasse" (im Identitätsinspektor). Der Compiler beschwert sich also mit einem Grund, dass die Klasse nicht existiert!
Vincent

9

Der beste Weg , um den Fehler zu entfernen: 1) Wählen Sie die Klassendatei (.m) 2) Unter „ Ziel Mitgliedschaft “, „check“ der Projektname Eintrag


Das funktioniert. Ich habe einen Pod entwickelt und aus irgendeinem Grund hat der Befehl pod install das falsche Ziel auf eine bestimmte Klassendatei angewendet. Es wurde auf ein Ressourcenpaket angewendet, das ich hatte. Die richtige Konfiguration ist Pods- <Projekt-Titel> - <Pod-Titel>
krosullivan

Das funktioniert bei mir nicht. Die Zielmitgliedschaft ist korrekt, aber der Fehler tritt weiterhin auf.
Kokodoko

8

Ich habe dies behoben, indem ich den Text aus meiner class.h und .m kopiert, diese Klassendateien aus dem Projekt gelöscht und mit "Add File" neue class.h- und .m-Dateien mit demselben Namen erstellt habe. Dann habe ich den Code wieder in die neuen Dateien eingefügt und alles hat super funktioniert. Irgendwie waren die Dateien beim Erstellen nicht richtig verknüpft. Danach musste ich keine Linker-Flags mehr verwenden.


1
Als ich die Dateien zum ersten Mal erstellt hatte, hatte ich am Ende keine .m. Ich habe versucht, die Datei umzubenennen und wieder hinzuzufügen, musste sie jedoch noch löschen und neu erstellen, bevor xcode zufrieden war.
odyth

Ihre Datei war wahrscheinlich nicht Teil Ihres Ziels. Das erneute Hinzufügen führte wahrscheinlich zu einem Standard-Kontrollkästchen im richtigen Ziel.
Jhoule

1
Diese Lösung hat auch bei mir funktioniert, aber ich habe zu 100% sichergestellt, dass ich vor dem Löschen der ersten Klasse (.h + .m) überprüft habe, ob sie Teil meines Ziels ist. Das war für mich nicht das Problem. Wie Laura habe ich die Klasse einfach gelöscht und erneut erstellt (mit einem anderen Namen), und es hat einwandfrei funktioniert, ohne eine der anderen Lösungen auf dieser Seite.
Nate

7

Ich habe dies ENDLICH behoben, ich hatte vergessen, den folgenden Code zu meiner .m-Datei hinzuzufügen:

@implementation MyTableViewCell

@end

Dies wurde verursacht, weil ich einen Platzhalter @interface für meine Tabellenzelle erstellt hatte, der eine Verbindung zu einem Element in der .xib-Datei hatte. Es gibt jedoch einen Fehler im Interface Builder, bei dem für eine Klasse keine @implementation angegeben wurde. es kann es nicht finden.

Ich hatte alle Schritte aus anderen Foren durchlaufen, in denen die .xib als Quelle und MyTableViewCell angezeigt wurde, obwohl ich sie aus meinem Code heraus kommentiert hatte. Ich hatte versucht, den Simulator zurückzusetzen. Ich habe sogar versucht, alle meine Klassen in separate Dateien aufzuteilen, die den gleichen Namen wie die Schnittstellen haben, aber bis dahin hat nichts funktioniert.

PS Nach meiner Erfahrung spielt es keine Rolle, ob sich die Namen der .h / .m-Dateien von den Namen der @ -Interface unterscheiden. Ich habe mehrere Dateien, die mehr als eine @ Schnittstelle enthalten, und sie funktionieren einwandfrei.

PPS Ich habe eine ausführlichere Erklärung, warum UITableViewCell und UICollectionViewCell diesen Fehler verursachen, unter https://stackoverflow.com/a/22797318/539149 sowie Informationen dazu, wie er zur Kompilierungszeit mit registerClass: forCellWithReuseIdentifier: angezeigt wird.


6

Dies liegt daran, dass die .xib einen veralteten Link zum alten App-Delegaten hat, der nicht mehr existiert. Ich habe es so behoben:

  • Klicken Sie mit der rechten Maustaste auf die .xib und wählen Sie Öffnen als> Quellcode
  • Suchen Sie in dieser Datei den alten App-Delegaten und ersetzen Sie ihn durch den neuen

Als Quellcode öffnen existiert nicht mehr, aber Sie können genauso einfach mit der rechten Maustaste klicken, im Finder anzeigen, dann mit der rechten Maustaste auf die Datei klicken und in TextEdit öffnen. Natürlich sichern Sie die Datei, bevor Sie Änderungen vornehmen;)
Scott Allen

6

Fügen Sie einfach den folgenden Code zu Beginn der Appdelegate-Anwendung für die Finishlanching-Methode hinzu, dann funktioniert es einwandfrei

[myclass class];


5

Ich habe diese und andere Antworten auf dieser Website ausprobiert, von denen keine für mich sortiert wurde. Diese Kommentare (von http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) halfen:

Nach dem Suchen und Suchen und Suchen entdeckte ich schließlich den Namen dieser gelöschten Klasse, die in einer Datei versteckt war. Ich musste die Interface Builder-Dateien in X-Code öffnen, indem ich mit der rechten Maustaste darauf klickte und 'Als Quellcode anzeigen' auswählte. Dann kam die Suche danach auf

<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>com.apple.InterfaceBuilder.IBCocoaTouchP lu gin</string>
<string>*this was the class name*</string>

Das einfache Entfernen dieser letzten Zeile behebt das Problem leider nicht und beklagt sich darüber, dass die Datei die falsche Anzahl von Elementen enthält. Sie müssen die entsprechende Zeile im Abschnitt der Zeilen darüber entfernen, auf die verwiesen wird CustomClass.


5

In meinem Fall habe ich XCode6, die angegebene Klasse .m-Datei landet in der Erstellungsphase an der falschen Stelle. Sie sollte sich unter Compile Sources befinden , aber in derBundle-Ressourcen kopieren


Dank dir habe ich angefangen, die Liste zu
durchsuchen


4

Dieses Problem scheint nicht veraltet zu sein.

Ich hatte das gleiche Problem mit Xcode 8 und löste es ähnlich wie Smilebot :

  1. Öffnen Sie Ihre Storyboard-Datei als "Quellcode" in Xcode:

  2. Suchen Sie nach der Klasse, auf die verwiesen wird, und entfernen Sie das gesamte Bit, das besagt

customClass = "UnrecognizedClassName"

  1. Öffnen Sie Ihre Storyboard-Datei erneut als "Interfacebuilder - Storyboard" und erstellen Sie Ihre App neu.

3

Entfernen Sie einfach MyClass.m und .h und fügen Sie sie erneut zum Projekt hinzu.


3

Ich hatte 'Unbekannte Klasse favouritesButton in der Interface Builder-Datei' und habe sie bis zu einer Storybook-Szene aufgespürt, in der die betreffende Schaltfläche eine gefälschte benutzerdefinierte Klasse von "favouritesButton" im Feld "Klasse" oben im Identitätsinspektor enthielt. Ich wollte diesen Wert in das nächste Feld einfügen: Identity Label.

Das Ändern auf "UIButton" löste das Problem.



1

Ich habe diesen Fehler heute beim Konvertieren meiner aaLuminate-App in Universal unter Xcode 4 festgestellt. Diese App basiert auf der Dienstprogrammvorlage und wurde ursprünglich unter Xcode 3 erstellt.

Um Zeit zu sparen, habe ich die iPhone-Haupt- und die Flipside-Ansicht in die entsprechenden Namen der Universal-App kopiert. Ich habe den Fehler "Unbekannte Klasse x in Interface Builder-Datei" festgestellt. In meinem Fall war nichts in den XIB-Dateien oder Zielen.

Ich hatte die Datei aaLuminate-Info.plist auch aus anderen Gründen kopiert - hier war der alte Schlüssel "Main nib file base name" auf MainWindow gesetzt.

Sobald ich diesen Schlüssel gelöscht habe, wurde das Problem behoben!


1

In meinem Fall ist dieser Fehler aufgetreten, weil ich versucht habe, Arbeit zu sparen, indem ich ein neues Projekt erstellt und dann mehrere Quelldateien gelöscht und die gleichnamigen Quelldateien aus dem Arbeitsprojekt kopiert habe. Ich habe auch meine MainStoryBoard-Datei kopiert, die nach meinem RootViewController gesucht hat. Als ich jedoch den ursprünglichen RootViewController gelöscht und dann im RootViewController des vorherigen Produkts hinzugefügt hatte, konnte der Vorgang "Dateien hinzufügen" das Zielfeld offensichtlich nicht wie oben vorgeschlagen "aktivieren". Indem Sie lediglich alle neu importierten ".m" -Dateien von newley besuchten und sicherstellen, dass das Kontrollkästchen für die Zielmitgliedschaft aktiviert war, war alles in Ordnung. Ich denke, was geschah, war, dass die Storyboard-Datei nach einer Klasse suchte, die vom Link "ausgeschlossen" wurde, weil die Zielmitgliedschaft deaktiviert war. Es hat den Trick getan, sicherzustellen, dass die erforderlichen Dateien für das Ziel in der Zielmitgliedschaft im Dateiinspektor so festgelegt sind. Danke Pat! (siehe oben)


1

In meinem Fall lag es daran, dass ich eine Unterklasse einer Unterklasse einer UITableView-Zelle in der .h-Datei deklariert habe (die Deklaration beider Unterklassen befand sich in derselben .h-Datei), aber vergessen habe, eine leere Implementierung dieser zweiten Unterklasse in der .h-Datei vorzunehmen .m Datei.

Vergessen Sie nicht, eine Unterklasse einer Unterklasse zu implementieren, die Sie in der .h-Datei deklarieren! klingt einfach, ist aber leicht zu vergessen, da Xcode dies für Sie erledigt, wenn Sie mit einer Klasse pro .h / .m-Datei arbeiten.


1

Ich hatte "Unbekannte Klasse RateView in Interface Builder", wobei RateView eine Unterklasse von UIView war. Ich hatte eine UIView in meine Storyboard-Szene eingefügt und das Feld "Benutzerdefinierte Klasse" in "RateView" geändert. Trotzdem trat dieser Fehler auf.

Zum Debuggen habe ich den Namen meiner Klasse in RateView2 geändert und alle Referenzen so geändert, dass sie mit Ausnahme des Felds Benutzerdefinierte Klasse der UIView übereinstimmen. Die Fehlermeldung wurde weiterhin wie zuvor mit RateView als fehlender Klasse angezeigt. Dies bestätigte, dass die Fehlermeldung mit dem Wert des Felds Benutzerdefinierte Klasse zusammenhängt. Ich habe diesen Wert in RateView2 geändert und die Fehlermeldung in "Unbekannte Klasse RateView2 in Interface Builder" geändert. Fortschritte in gewisser Weise.

Schließlich habe ich die Quellcodedateien selbst im Dateiinspektor überprüft. Dort stellte ich fest, dass die Quellcodedatei (die ich aus einem Tutorial kopiert hatte) nicht mit meinem Ziel verknüpft war. Mit anderen Worten, es hatte keine Zielmitgliedschaft. Ich habe das Kontrollkästchen aktiviert, mit dem die Quellcodedatei der Klasse zu einem Mitglied der Ziel-App gemacht wurde, und die Fehlermeldung ist verschwunden.


1

In meinem Fall hatte ich eine Klasse namens "viewController" gelöscht, ohne zu bemerken, dass sie mit dem Identitätsinspektor des Storyboards ausgewählt wurde (oben unter "Benutzerdefinierte Klasse").

Sie müssen lediglich die richtige Klasse für den Ansichtscontroller im Feld Benutzerdefinierte Klasse Ihres Identitätsinspektors auswählen oder Ihrem Projekt eine neue Klasse hinzufügen und diese als benutzerdefinierte Klasse auswählen.

Hat für mich gearbeitet!



1

Das hat mich ein bisschen verrückt gemacht und keiner der obigen Vorschläge hat mir geholfen, den Fehler loszuwerden. Glücklicherweise hatte ich nur ein IB-Objekt, das die Klasse verwendete, also habe ich es einfach gelöscht und mit derselben angegebenen Klasse wieder hinzugefügt. Fehler ging weg ...

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.