Obwohl Interface Builder a kennt MyClass
, wird beim Starten der Anwendung eine Fehlermeldung angezeigt.
Dies geschieht, wenn MyClass
es Teil einer Bibliothek ist, und nicht, wenn ich die Klasse direkt im Anwendungsziel kompiliere.
Obwohl Interface Builder a kennt MyClass
, wird beim Starten der Anwendung eine Fehlermeldung angezeigt.
Dies geschieht, wenn MyClass
es Teil einer Bibliothek ist, und nicht, wenn ich die Klasse direkt im Anwendungsziel kompiliere.
Antworten:
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, MyClass
wird 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 -ObjC
standardmäß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 _keepAtLinkTime
Methode 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, MyClass
das irgendwo verwendet wird, damit es nicht so aggressiv bei der Optimierung ist.
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.
MyClass
. Rufen Sie einfach eine Methode auf, von der es erbt NSObject
, wie z +class
.
MyClass.m
im Abschnitt Zielmitgliedschaft des Dateiinspektors überprüfen .
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.
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 -ObjC
dem Other Linker Flags
Schlü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_load
Linker-Flag hinzufügen . Wenn Sie diese Flags früher oder später überspringen, werden Sie auf den Fehler stoßen unrecognized selector
oder andere Ausnahmen erhalten, wie die hier beobachtete.
-ObjC
Flagge es in meinem Fall reparierte.
-ObjC
gut genug, um das Problem zu beheben.
Ich bin heute mit Swift auf dieses Problem gestoßen.
Ich habe eine Klasse Model.h + Model.m
in 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"
Module
Name genau dort in der Dropdown-Liste. Es war der Name meiner App.
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
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
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">
customModule="MyFrameworkName"
. Riesige +10
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
Gehen Sie zu Build Phases-> Compile Sources und fügen Sie Ihre neuen .m-Dateien hinzu.
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.
customClass="MyCla"
. B. ). Anstatt die benutzerdefinierte Klassenzuweisung zu löschen, war es für mich
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?
du solltest gut sein, danach zu gehen
Der beste Weg , um den Fehler zu entfernen: 1) Wählen Sie die Klassendatei (.m) 2) Unter „ Ziel Mitgliedschaft “, „check“ der Projektname Eintrag
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.
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.
Dies liegt daran, dass die .xib einen veralteten Link zum alten App-Delegaten hat, der nicht mehr existiert. Ich habe es so behoben:
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
.
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 der
Nicht nur in den Projekteinstellungen, sondern auch in der Zieleinstellung müssen Sie -all_load -ObjC-Flags hinzufügen.
Core-Plot: Unbekannte Klasse CPLayerHostingView in der Interface Builder-Datei
Dieses Problem scheint nicht veraltet zu sein.
Ich hatte das gleiche Problem mit Xcode 8 und löste es ähnlich wie Smilebot :
Öffnen Sie Ihre Storyboard-Datei als "Quellcode" in Xcode:
Suchen Sie nach der Klasse, auf die verwiesen wird, und entfernen Sie das gesamte Bit, das besagt
customClass = "UnrecognizedClassName"
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.
Ich bin in Swift darauf gestoßen.
Durch Verschieben der .xib-Datei in den Base.lproj-Ordner des Projekts wurde dieser Fehler behoben.
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!
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)
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.
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.
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!
Ich habe die Datei Under Build Phase in Targets hinzugefügt und das Problem wurde behoben. Die Schritte zum Hinzufügen der Datei finden Sie in meiner Antwort unter:
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 ...