“Classe sconosciuta nel file Interface Builder” errore in fase di esecuzione

Anche se Interface Builder è a conoscenza di una MyClass , ricevo un errore all’avvio dell’applicazione.

Questo accade quando MyClass fa parte di una libreria e non si verifica se compilo la class direttamente nella destinazione dell’applicazione.

Malgrado il file ” Classe sconosciuta MyClass in Interface Builder. ” Errore stampato in fase di esecuzione, questo problema non ha nulla a che fare con Interface Builder, ma con il linker, che non collega una class perché nessun codice lo usa direttamente.

Quando i dati .nib (compilati da .xib) vengono caricati in fase di runtime, MyClass viene referenziato utilizzando una stringa, ma il linker non analizza la funzionalità del codice, solo l’esistenza del codice, quindi non lo sa. Poiché nessun altro file di origine fa riferimento a tale class, il linker lo ottimizza al momento dell’esecuzione dell’eseguibile. Quindi, quando il codice di Apple tenta di caricare una class di questo tipo, non riesce a trovare il codice associato e stampa l’avviso.

Per impostazione predefinita, gli obiettivi Objective-C avranno i flag -all_load -ObjC impostati di default, che manterranno tutti i simboli. Ma avevo iniziato con un objective C ++ e non avevo questo. Tuttavia, ho trovato un modo per aggirare questo, che mantiene aggressivo il linker.

L’hack che stavo usando originariamente era di aggiungere una routine statica vuota come:

 +(void)_keepAtLinkTime; 

che non fa nulla, ma che chiamerei una volta, come ad esempio:

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

Ciò costringerebbe il linker a mantenere l’intera class e l’errore scomparirà.

Come sottolineato da jlstrecker nei commenti, non è necessario aggiungere un metodo _keepAtLinkTime . Basta chiamare uno esistente, ad esempio:

  [MyClass class]; 

fa il trucco (a patto che tu provenga da un NSObject ).

Certo, puoi chiamarlo in qualsiasi posizione del tuo codice. Immagino che potrebbe anche essere in un codice irraggiungibile. L’idea è di ingannare il linker nel pensare che MyClass sia usato da qualche parte in modo che non sia così aggressivo nell’ottimizzarlo.

Xcode 6.3.2 e Swift 1.2

Definizione rapida della vista. Assicurarsi di sovrascrivere init(coder aDecoder: NSCoder) . Definizione Objective-C del controller della vista. E un pennino in un pero.

Aggiungi Nome modulo all’ispettore Dettagli pennino dove scegli la tua class.

Ho risolto questo concetto seguendo le linee suggerite da Laura, ma non ho avuto bisogno di ricreare i file.

  • Utilizzando XCode 4, in Project Navigator , selezionare il file .m che contiene la class di cui si lamenta

  • Vai a Visualizza-> Utilità-> Mostra Impostazioni File
    (questo mostrerà il File Inspector sulla destra, con le informazioni del file .m)

  • Apri la sezione Target Membership e assicurati che il tuo target sia selezionato per questo file .m

Quando ho aggiunto il mio file .m al mio progetto, non l’ho aggiunto al mio target predefinito per qualche motivo e questo mi ha fatto ottenere l’errore che hai menzionato.

Questo non ha nulla a che fare con Interface Builder, quello che sta succedendo qui è che i simboli non vengono caricati dalla libreria statica di Xcode. Per risolvere questo problema è necessario aggiungere i flag -all_load -ObjC alla chiave Other Linker Flags flag per -all_load -ObjC le -all_load -ObjC del progetto (e possibilmente del target).

Poiché Objective-C genera solo un simbolo per class, dobbiamo obbligare il linker a caricare anche i membri della class usando il flag -ObjC, e dobbiamo anche forzare l’inclusione di tutti i nostri oggetti dalla nostra libreria statica aggiungendo il -all_load bandiera. Se salti questi flag prima o poi ti imbatterai nell’errore del unrecognized selector o riceverai altre eccezioni come quella che hai osservato qui.

Oggi ho incontrato questo problema usando Swift.

Ho cambiato una class Model.h + Model.m in Model.swift . Questo object è stato utilizzato in Interface Builder con la class = Model .

Non appena ho sostituito l’object, la class non può più essere caricata.

Quello che dovevo fare era cambiare il riferimento di class in IB da:

 Class = Model Module = 

a

 Class = Model Module =  

Troverai nelle impostazioni di generazione. È anche il nome che compare nella tua Swift-Header generata: #import "TARGETNAME-Swift.h"

Vai a “ProjectName”, fai clic su di esso, quindi vai alla scheda “Costruisci fasi”, quindi fai clic su “Compila fonti”, quindi fai clic sul pulsante “+”, apparirà una finestra, scegli “MyClass”. m “file e quindi fare clic su” aggiungi “,

Costruisci il progetto ed eseguilo, il problema verrà sicuramente risolto

È un problema con la cache Xcode4, basta eliminare tutte le cartelle in / Users / your_user / Library / Application Support / iPhone Simulator / 4.3 / Applications /

Inoltre, se hai lo stesso problema sul tuo iPhone, elimina la vecchia app prima di eseguirla …

In bocca al lupo. Pascual

A volte IBuilder ha perso customModule="AppName" customModuleProvider="target"

Per risolvere il problema, apri lo storyboard come codice sorgente e sostituisci questa riga:

  

a questa:

  

Vai a Build Phases-> Compile Sources e aggiungi i tuoi nuovi file .m.

Nel mio caso stava mostrando un errore per una class che non esisteva nemmeno! Sospettavo che fosse qualcosa che si era bloccato nel file dello storyboard. Se non si riconosce il file di class nell’errore, provare questo:

1) apri il tuo progetto in sublime o un altro buon editor. Cerca la class a cui ci si riferisce. 2) rimuovi tutto il bit che dice

 customClass="UnrecognizedClassName" 

3) salvalo. 4) torna a xcode e pulisci il progetto, e prova a eseguirlo ora.

ha funzionato per me

inserisci la descrizione dell'immagine qui

Il mio caso: cercando di utilizzare una class da una struttura rapida nel mio progetto objective c, ho ricevuto questo errore. La soluzione era aggiungere Module (swift framework) della class in Interface builder / Storyboard come mostrato di seguito. Nient’altro

inserisci la descrizione dell'immagine qui

Voglio solo aggiungere questa risposta dal momento che la maggior parte se non tutte le risposte qui assumono che la class esista effettivamente .. è solo che il linker / compilatore è troppo stupido per vederlo .. quindi le risposte ruotano attorno ad avvisare il linker all’esistenza della class o creando un hack per ‘forzare’ esistere ..

il mio problema si verifica quando questo messaggio sta effettivamente parlando di una class inesistente .. quindi un esempio potrebbe essere il ripristino di una vecchia revisione git che non ha alcuna conoscenza di una certa class .. eppure il compilatore si lamenta che la suddetta class non lo fa esistono …

soluzione?

  • Nuke il tutto! per prima cosa cancella tutti i file di costruzione, eliminando tutti i contenuti in questa directory ~ / Libreria / Sviluppatore / Xcode / DerivedData
  • elimina l’app dal telefono stesso (e cancella il contenuto del simulatore se stai utilizzando un simulatore)

dovresti essere bravo a seguirlo

Il modo migliore per rimuovere l’errore è: 1) Selezionare il file di class (.m) 2) in ” Appartenenza di destinazione “, “verificare” la voce del nome progetto

Ho risolto questo problema copiando il testo dal mio class.h e .m, cancellando quei file di class dal progetto e creando nuovi file class.h e m con lo stesso nome usando “Aggiungi file”. Poi ho incollato il codice nei nuovi file e tutto ha funzionato alla grande. In qualche modo i file non erano collegati correttamente quando sono stati creati. Dopo di ciò non avevo bisogno di usare alcun flag di linker.

Ciò accade perché il .xib ha un collegamento obsoleto al vecchio delegato dell’app che non esiste più. L’ho risolto così:

  • Fai clic destro su .xib e seleziona Apri come> Codice sorgente
  • In questo file, cerca il vecchio delegato dell’app e sostituiscilo con quello nuovo

basta aggiungere il codice sottostante all’inizio del metodo appdelegate applicatoindidfinishlanching, quindi funzionerà correttamente

[class di class];

Ho risolto FINALMENTE, avevo dimenticato di aggiungere il seguente codice al mio file .m:

 @implementation MyTableViewCell @end 

Quindi è stato causato dal fatto che avevo creato un segnaposto @interface per la mia cella di tabella, che aveva una connessione con un elemento nel file .xib, ma c’è un bug in Interface Builder dove se non è specificata l’implementazione @ per una class, non riesce a trovarlo

Ho seguito tutti i passaggi da altri forum per visualizzare il .xib come sorgente e vedere MyTableViewCell anche se avevo commentato il mio codice. Ho provato a resettare il simulatore. Ho persino provato a suddividere tutte le mie classi in file separati con lo stesso nome delle interfacce, ma niente ha funzionato fino a questo punto.

PS nella mia esperienza, non importa se i nomi dei file .h / .m sono diversi dai nomi dell’interfaccia @. Ho diversi file contenenti più di un’interfaccia @ e funzionano bene.

PPS Ho una spiegazione più dettagliata del perché UITableViewCell e UICollectionViewCell causano questo errore su https://stackoverflow.com/a/22797318/539149 insieme a come rivelarlo in fase di compilazione utilizzando registerClass: forCellWithReuseIdentifier :.

Ho provato questo e altre risposte elencate su questo sito, nessuna delle quali è stata ordinata per me. Questi commenti (da http://www.iphonedevsdk.com/forum/iphone-sdk-development/43330-unknown-class-interface-builder-file.html ) hanno aiutato:

Dopo aver cercato, cercato e cercato, ho finalmente scoperto il nome di questa class eliminata nascosta in un file. Ho dovuto aprire i file del generatore di interfaccia in X-code, facendo clic con il tasto destro su di essi e scegliendo “Visualizza come codice sorgente”. Poi la ricerca è arrivata

  YES com.apple.InterfaceBuilder.IBCocoaTouchP lu gin *this was the class name* 

La semplice rimozione dell’ultima riga non lo risolve sfortunatamente, lamentando il numero errato di elementi nel file. È necessario rimuovere la riga corrispondente nella sezione di linee sopra di essa, che si riferisce a CustomClass .

Nel mio caso, ho XCode6, il file di class .m specificato finisce nel posto sbagliato nella fase di costruzione – Dovrebbe essere stato in Compile Sources , ma finire nel Copia le risorse del pacchetto

Questo problema non sembra essere superato.

Ho avuto lo stesso problema con Xcode 8 e l’ho risolto come lo smilebot :

  1. Apri il tuo file storyboard come “Codice sorgente” all’interno di Xcode:

  2. Cerca la class a cui ci si riferisce e rimuovi l’intero bit che dice

CustomClass = “UnrecognizedClassName”

  1. Apri nuovamente il file storyboard come “interfacebuilder – storyboard” e ricostruisci la tua app.

Non solo nelle impostazioni del progetto, ma anche nell’impostazione Target è necessario aggiungere -all_load -ObjC flag ..

Core-Plot: class sconosciuta CPLayerHostingView nel file Interface Builder

Basta rimuovere MyClass.m e .h e aggiungerli al progetto di nuovo è lavoro per me.

Ho avuto “Preferiti di class sconosciutiButton in Interface Builder file” e l’ho rintracciato in una scena da libro di fiabe in cui il pulsante in questione aveva una falsa class personalizzata di “Preferiti” nel campo Classe nella parte superiore di Identity Inspector. Intendevo mettere quel valore nel campo seguente: Identity Label.

La modifica di questo in “UIButton” ha risolto il problema.

Mi sono imbattuto in questo in Swift.

Spostare il file .xib nella cartella Base.lproj del progetto si è sbarazzato di questo errore.

Oggi ho riscontrato questo errore durante la conversione della mia app aaLuminate in Universal con Xcode 4. Questa app è basata sul modello di utilità ed è stata originariamente creata con Xcode 3.

Per risparmiare tempo, ho copiato le viste Main e Flipside di iPhone con nomi appropriati sull’app Universal. Ho riscontrato l’errore “Classe sconosciuta x in Interface Builder”. Nel mio caso non c’era nulla nei file XIB o nei target.

Ho anche copiato il file aaLuminate-Info.plist per altri motivi – questo aveva una vecchia chiave “Nome base file di pennini principale” impostata su MainWindow.

Appena ho cancellato questa chiave ha risolto il problema!

Nel mio caso ho ricevuto questo errore perché avevo cercato di salvare un po ‘di lavoro creando un nuovo progetto e poi cancellando molti dei file sorgente e copiando i file sorgenti con lo stesso nome dal progetto di lavoro. Ho anche copiato il mio file MainStoryBoard che cercava il mio RootViewController. Tuttavia, quando avevo eliminato il RootViewController originale e poi aggiunto nel RootViewController dal prodotto precedente, evidentemente l’operazione Aggiungi file non riusciva a “spuntare” la casella di destinazione come suggerito sopra. Cercando semplicemente tutti i nuovi file “.m” importati e assicurandosi che la casella di appartenenza di destinazione fosse selezionata, tutto andava bene. Penso che quello che stava succedendo era che il file storyboard cercava una class che era stata “esclusa” dal collegamento perché l’appartenenza al target non era selezionata. Assicurarsi che i file richiesti per il target siano così designati nell’appartenenza al target nel file inspector ha fatto il trucco. Grazie Pat! (vedi sopra)

Nel mio caso è stato perché ho dichiarato una sottoclass di una sottoclass di una cella UITableView nel file .h (la dichiarazione di entrambe le sottoclassi erano nello stesso file .h), ma ho dimenticato di fare un’implementazione vuota di quella seconda sottoclass nel .m file.

non dimenticare di implementare qualsiasi sottoclass di una sottoclass dichiarata nel file .h! sembra semplice, ma facile da dimenticare perché Xcode farà questo per te se stai lavorando con una class per file .h / .m.

Ho avuto “Unknown RateView di class in Interface Builder” dove RateView era una sottoclass di UIView. Ho lasciato cadere un UIView nella scena Storyboard e ho modificato il campo della class personalizzata in RateView. Eppure, questo errore è apparso.

Per eseguire il debug, ho modificato il nome della mia class in RateView2 e ho modificato tutti i riferimenti in modo che corrispondessero, ad eccezione del campo Classe personalizzata di UIView. Il messaggio di errore è ancora apparso come prima con RateView come class mancante. Ciò ha confermato che il messaggio di errore era correlato al valore del campo di class personalizzato. Ho cambiato questo valore in RateView2 e il messaggio di errore è stato modificato in “Classe sconosciuta RateView2 in Interface Builder”. Progressi di sorta.

Infine, ho ispezionato i file del codice sorgente stessi in File Inspector. Lì ho scoperto che il file del codice sorgente (che avevo copiato da un tutorial) non era associato al mio Target. In altre parole, non ha avuto alcun target di appartenenza. Ho controllato la casella che ha reso il file del codice sorgente della class un membro dell’app di destinazione e il messaggio di errore è andato via.

Nel mio caso ho cancellato una class chiamata “viewController” senza rendermi conto che era stata selezionata con l’ispettore dell’identity framework dello storyboard (in ‘Custom Class’ in alto).

Devi semplicemente selezionare la class corretta per il controller di visualizzazione nel campo Classe personalizzata dell’ispettore id quadro o aggiungere una nuova class al progetto e selezionarla come class personalizzata.

Ha funzionato per me!

Ho aggiunto il file Under Build Phase in Targets e il problema è stato risolto. Per i passaggi per aggiungere il file, vedere la risposta a:

Errore di Apple Mach-O Linker (APActivityIcon)

Questo mi ha fatto impazzire per un po ‘e nessuno dei suggerimenti di cui sopra mi ha aiutato a liberarmi dell’errore. Fortunatamente ho avuto solo un object IB usando la class, quindi l’ho appena cancellato e l’ho aggiunto con la stessa class specificata. L’errore è andato via …