Errore "Classe sconosciuta <MyClass> nel file Interface Builder" in fase di esecuzione


260

Anche se Interface Builder è a conoscenza di a MyClass, viene visualizzato un errore all'avvio dell'applicazione.

Questo succede quando MyClassfa parte di una libreria e non succede se compilo la classe direttamente nella destinazione dell'applicazione.


Come si collega alla biblioteca?
Elise van Looij,

Uso un sottoprogetto dipendente e ho fatto un trascinamento dai prodotti del sottoprogetto Xcode nella fase di costruzione "Link Binary With Library" del mio obiettivo attuale.
jhoule,

Se la classe proviene da CocoaPods, questo potrebbe aiutare github.com/CocoaPods/CocoaPods/issues/491 .
Protocollo del

Potrebbe essere correlato? stackoverflow.com/a/24924967/511299
Sunkas

Risposte:


222

Nonostante l' errore " Classe sconosciuta MyClass nel file Interface Builder " stampato in fase di esecuzione, questo problema non ha nulla a che fare con Interface Builder, ma piuttosto con il linker, che non collega una classe perché nessun codice la utilizza direttamente.

Quando i dati .nib (compilati da .xib) vengono caricati in fase di esecuzione, MyClassviene referenziato usando una stringa, ma il linker non analizza la funzionalità del codice, ma solo l'esistenza del codice, quindi non lo sa. Poiché nessun altro file di origine fa riferimento a quella classe, il linker la ottimizza come non esistente durante la creazione dell'eseguibile. Pertanto, quando il codice Apple tenta di caricare una tale classe, non riesce a trovare il codice associato e stampa l'avviso.

Per impostazione predefinita, i target Objective-C avranno -all_load -ObjCflag impostati di default, che manterranno tutti i simboli. Ma avevo iniziato con un target C ++ e non ce l'avevo. Tuttavia, ho trovato un modo per aggirare questo, che mantiene aggressivo il linker.

L'hack che stavo usando inizialmente era quello 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 classe e l'errore scompare.

Come ha sottolineato jlstrecker nei commenti, non abbiamo davvero bisogno di aggiungere un _keepAtLinkTimemetodo. Basta chiamarne uno esistente, come ad esempio:

   [MyClass class];

fa il trucco (purché tu derivi da un NSObject).

Naturalmente, 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 MyClasssia usato da qualche parte in modo che non sia così aggressivo nell'ottimizzarlo.

Xcode 6.3.2 e Swift 1.2

Rapida definizione della vista. Assicurati di scavalcare init(coder aDecoder: NSCoder). Definizione obiettivo-C del controller di visualizzazione. E un pennino in un pero.

Aggiungi la finestra di ispezione dei dettagli del Nome modulo al punto in cui scegli la classe.


2
I dati .xib non vengono caricati in fase di esecuzione. Il compilatore IB compila lo xib in un pennino; il pennino è ciò che viene caricato in fase di esecuzione.
Peter Hosey,

19
Non devi modificare MyClass. Basta chiamare un metodo da cui eredita NSObject, come +class.
jlstrecker,

10
Sebbene non fosse Xcode 4 quando è stata pubblicata la domanda originale, il seguente sembra ancora appropriato. In Xcode 4 invece di aggiungere un metodo fittizio per eliminare l'errore, puoi controllare tutti gli obiettivi necessari MyClass.mnella sezione Appartenenza target di File Inspector.
adubr,

51
Un'altra possibilità al giorno d'oggi è che MyClass.m potrebbe non essere nella fase di compilazione delle Sorgenti di compilazione. Questo può accadere se trascini MyClass.h / m nel tuo progetto, anziché crearli usando Nuovo file.
Steven Fisher,

6
@JoshBruce puoi spiegare la soluzione Swift? Non lo capisco davvero.
Ryan Bobrowski,

183

Ho risolto questo problema seguendo le indicazioni di Laura, ma non avevo bisogno di ricreare i file.

  • Utilizzando XCode 4, in Project Navigator , selezionare il file .m che contiene la classe di cui si sta lamentando

  • Vai su Visualizza-> Utilità-> Mostra File Inspector
    (questo mostrerà File Inspector a destra, con quelle informazioni sul file .m)

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

Quando ho aggiunto il mio file .m al mio progetto, non lo ha aggiunto alla mia destinazione predefinita per qualche motivo e questo mi ha causato l'errore che hai menzionato.


È vero che a volte l'errore del linker è dovuto al fatto di non semplicemente compilare il file nella destinazione in primo luogo. Quello che descrivi è il modo di controllare i target a cui è associato un file. Sfortunatamente, il mio file faceva già parte del mio target, ma avevo ancora un problema di collegamento. Ciò era probabilmente dovuto al fatto che la mia libreria era C ++ (al contrario di Objective-C), che ha diversi flag di linker predefiniti (vedi i post di Alasdair Allan e Sijo sopra).
jhoule,

5
Questo suggerimento ha funzionato per me, anche se in modo leggermente diverso, dal momento che la mia casella di controllo "Target Membership" era già selezionata. L'ho deselezionato e ricostruito, ma poi il messaggio di errore è cambiato per indicare il mio nuovo nome di classe. Ricontrollando la scatola e costruendo di nuovo, ora tutto funziona. Molto più semplice dell'eliminazione dei file di cache!
electromaggot

Ottima soluzione tramite l'interfaccia utente Xcode. @electromaggot, Xcode potrebbe confondersi quando si aggiungono le classi manualmente, quindi potrebbe essere necessario aggiungere più di un file.
Gonen,

Questa è una soluzione anche per me. Avevo trascinato alcuni file di classe da un altro progetto e quei file di classe erano quelli che avevano sollevato l'eccezione.
Hairbo

1
Ho eliminato un file dal mio progetto, quindi ho aggiunto lo stesso file più tardi e questo ha risolto il problema.
MindSpiker,

70

Questo non ha nulla a che fare con Interface Builder, quello che sta succedendo qui è che i simboli non vengono caricati dalla tua libreria statica da Xcode. Per risolvere questo problema devi aggiungere i -all_load -ObjCflag alla Other Linker Flagschiave delle impostazioni di costruzione del progetto (e possibilmente della destinazione).

Poiché Objective-C genera un solo simbolo per classe, dobbiamo forzare il linker a caricare anche i membri della classe utilizzando il flag -ObjC e dobbiamo anche forzare l'inclusione di tutti i nostri oggetti dalla nostra libreria statica aggiungendo il -all_loadflag linker. Se salti queste bandiere prima o poi ti imbatterai nell'errore unrecognized selectoro otterrai altre eccezioni come quella che hai osservato qui.


5
Ho scoperto che solo la -ObjCbandiera l'ha riparata nel mio caso.
Kekoa,

5
@Kekoa questo perché la tua versione di Xcode (LLVM) è più recente di quella usata dal ragazzo che ha scritto questa risposta. Al giorno d'oggi, l'utilizzo -ObjCè abbastanza buono per risolvere il problema.
Fino

questo mi ha solo aiutato. Durante la compilazione ha mostrato i problemi relativi al framework necessari che si sono risolti anche dopo aver importato tutti i framework.
Vaibhav Saran,

-ObjC flag da solo risolto il mio problema. In realtà ho ricevuto un errore per avere l'attributo all_load in iOS7.
Sushma Satish,

L'uso di -all_load -ObjC potrebbe causare un inutile aumento delle dimensioni del prodotto. questo problema si verifica anche con i file di categoria solo nei framework.
Ali Amin,

26

Oggi ho riscontrato questo problema usando Swift.

Ho cambiato una classe Model.h + Model.min a Model.swift. Questo oggetto è stato utilizzato in Interface Builder con class = Model.

Non appena ho sostituito l'oggetto, la classe non può più essere caricata.

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

Class = Model
Module = 

per

Class = Model
Module = <TARGETNAME>

Troverai il <TARGETNAME>nelle impostazioni di costruzione. È anche il nome che appare nel tuo Swift-Header generato:#import "TARGETNAME-Swift.h"


1
Questa sembra essere la risposta corretta. A meno che qualcuno non possa dire diversamente, questo dovrebbe essere contrassegnato come corretto.
Bjørn Ruthberg,

1
Ottima risposta grazie. Per me il Modulenome era proprio lì nel menu a discesa. Era il nome della mia app.
ChrisH,

Per me funziona. Per il mio problema, <TARGETNAME> menzionato nella tua risposta, è il nome del framework che contiene la classe.
Tyler Long,

Sono giunto alla conclusione da solo, questo è stato anche l'errore che stavo riscontrando ed ero disposto a pubblicare i miei risultati quando ho visto il tuo post. In realtà l'ho visto ma è passato vicino, a causa delle molte risposte e del rumore che lo circonda. Penso che la tua risposta potrebbe essere migliorata da alcuni screenshot per differenziare la tua risposta dagli altri. Lo prenderei sicuramente se fosse così. Molte grazie, comunque, per averlo pubblicato qui. Hai ottenuto il mio voto.
jvarela,

Per AppDelegate, sono stato in grado di risolvere questo problema nell'interfaccia utente di Interface Builder. Per la classe personalizzata di un elemento dell'interfaccia utente all'interno di una finestra, l'interfaccia utente di Interface Builder non mi consente di impostare la classe e il modulo personalizzati. Ho dovuto fare quanto segue: (1) Apri il file .xib come "Codice sorgente" (fai clic destro su di esso). (2) Aggiungi l'attributo "customModule = <TARGETNAME>" accanto all'attributo customClass.
Poulsbo,

20

Vai su "ProjectName", fai clic su di esso, quindi vai sulla scheda "Fasi di costruzione", quindi fai clic sul pulsante "compila origini", quindi fai clic sul pulsante "+", verrà visualizzata una finestra, scegli "MyClass". m "file e quindi fare clic su" Aggiungi ",

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


Sì, non avevo selezionato TUTTE le caselle di destinazione che volevo aggiungere alle mie classi appena importate. Grazie!
Joel Balmer,

Sì! Il mio file VC mancava dal progetto Target.
Sebastian Dwornik,

19

È un problema di cache di Xcode4, basta eliminare tutte le cartelle in / Utenti / tuo_utente / Libreria / Supporto applicazioni / Simulatore iPhone / 4.3 / Applicazioni /

Inoltre, se hai lo stesso problema con il test sul tuo iPhone, elimina la vecchia app prima di eseguirla ...

In bocca al lupo. Pascual


8
Nelle impostazioni di compilazione del progetto è necessario aggiungere i flag "-all_load -ObjC" alla chiave "Altre bandiere linker". Questo non è un problema specifico di Xcode 4, e in effetti generalmente non ha nulla a che fare con Interface Builder.
Alasdair Allan,

Questa soluzione è già stata suggerita nel gennaio 2010 (vedi sopra).
jhoule,

6
Sì, il modo più semplice per farlo è aprire il simulatore iOS e dal menu scegliere "Ripristina contenuto e impostazioni"
RanLearns

Oppure potresti fare quello che ho fatto ed eliminare l'app in questione dalla schermata principale del Simulatore. Ho avuto lo stesso messaggio di errore, ma faceva riferimento a un vecchio delegato dell'app.
spstanley,

16

A volte mancava IBuilder customModule="AppName" customModuleProvider="target"

Per risolverlo, apri lo storyboard come codice sorgente e sostituisci questa riga:

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

a questa:

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

L'uso di Xcode 6.3 (6D570) non appena eseguo l'impostazione ritorna a quello originale (non valido). Bug? Sto cercando di includere un file rapido in un progetto Obiettivo C.
addzo,

Su XCode 6.4, solo l'aggiunta di customModuleProvider = "target" nel codice sorgente dello storyboard, sotto il viewcontroller desiderato, risolto il problema.
Amro Shafie,

Sono stato in grado di risolvere il mio problema con solo customModule="MyFrameworkName". Enorme +10
Stan

In realtà, il mio problema era l'opposto, volevo eliminare CustomTaget ma Xcode non stava cambiando il file sorgente xib, quindi ho dovuto eliminare customModule = "AppName" customModuleProvider = "target" per farlo funzionare.
Adriana

14

Il mio caso: nel tentativo di utilizzare una classe da un framework rapido nel mio progetto obiettivo c, ho riscontrato questo errore. La soluzione era aggiungere il modulo (framework rapido) della classe in Interface builder / Storyboard come mostrato di seguito. Nient'altro

inserisci qui la descrizione dell'immagine


2
Sto usando un framework Swift nel progetto Swift installato da CocoaPods. Questo metodo funziona. E il nome del modulo è il nome del framework.
JsW

1
Questo funziona perfettamente. Hai bisogno di perché quel modulo è stato rimosso ??
iSrinivasan27,

Funziona perfettamente con problemi di framework cocoapod ... complimenti per la risposta perfetta ...
jayant rawat

13

Vai a Crea fasi-> Compila fonti e aggiungi i tuoi nuovi file .m.


Sì, dopo aver aggiunto nuovi file da un precedente progetto in un progetto XCode 4.5, l'aggiunta dei file .m all'elenco Compile Sources ha fatto sicuramente. L'aggiunta di "-all_load -ObjC" non ha funzionato nel mio caso, ma non ha fatto male.
whyoz,

13

Nel mio caso stava mostrando un errore per una classe che non esisteva nemmeno! Sospettavo fosse qualcosa che è stato intercettato nel file dello storyboard. Se non riconosci il file di classe nell'errore, prova questo:

1) apri il tuo progetto in sublime o in un altro buon editor. Cerca la classe cui si fa riferimento. 2) rimuovere l'intero bit che dice

customClass="UnrecognizedClassName"

3) salvalo. 4) tornare a xcode e pulire il progetto e provare a eseguirlo ora.

ha funzionato per me.

inserisci qui la descrizione dell'immagine


Uso l'app OSX TextEdit. Ha funzionato bene per questa operazione. Assicurati di chiudere prima il tuo progetto e chiudere Xcode.
TJ

Anche questo ha aiutato. Avevo più di un oggetto con la stessa customClass, probabilmente ho fatto clic sulla vista anziché sul controller e ho assegnato lo stesso nome.
Mc-

1
Questa era anche la soluzione al problema che ho riscontrato; In precedenza avevo inserito un nome di classe parziale e in qualche modo lo storyboard era stato salvato in quel modo (ad esempio customClass="MyCla"). Invece di eliminare l'assegnazione della classe personalizzata, era prudente per me semplicemente inserire la classe che intendevo utilizzare in primo luogo :)
dave,

9

Voglio solo aggiungere questa risposta dal momento che la maggior parte, se non tutte, le risposte qui presuppongono che la classe esista effettivamente .. è solo che il linker / compilatore è troppo stupido per vederlo .. quindi le risposte ruotano attorno all'allerta del linker sull'esistenza della classe o creando un hack per "forzare" esiste ..

il mio problema si verifica quando questo messaggio parla in realtà di una classe inesistente .. quindi un esempio potrebbe essere il mio ritorno a una vecchia revisione git che non ha conoscenza di una certa classe .. eppure il compilatore si lamenta che la suddetta classe non ' t esiste ..

soluzione?

  • Nuke tutto! prima cancella tutti i file di build ecc. eliminando tutto il contenuto in questa directory ~ / Library / Developer / Xcode / DerivedData
  • elimina l'app dal telefono stesso (e cancella il contenuto del simulatore se stai usando un simulatore)

dovresti essere bravo a seguirlo


2
Non posso fare +1 su questo, risolto il mio problema. Il mio problema era esattamente lo stesso in cui il file era già stato eliminato ma l'avviso era ancora visualizzato quando compilato.
Brett,

Nello Storyboard devi inserire l'identificatore. A volte lo scrivo per errore nel campo "Classe" (nell'Ispettore identità). Quindi il compilatore si lamenta con un motivo per cui la Classe non esiste!
Vincent,

9

Il modo migliore per rimuovere l'errore è: 1) Selezionare il file di classe (.m) 2) Sotto " Appartenenza target ", "selezionare" la voce Nome progetto


Questo funziona Stavo sviluppando un pod e per qualche motivo il comando di installazione pod stava applicando la destinazione sbagliata a un determinato file di classe. Era stato applicato a un pacchetto di risorse che avevo. La configurazione corretta è Pods- <project-title> - <pod-title>
krosullivan

Questo non funziona per me. L'appartenenza alla destinazione è corretta, ma l'errore continua a verificarsi.
Kokodoko,

8

Ho risolto questo problema copiando il testo dal mio class.h e .m, eliminando quei file di classe dal progetto e creando nuovi file class.h e .m con lo stesso nome usando "Aggiungi file". Quindi 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 non ho più avuto bisogno di usare alcun flag linker.


1
quando avevo creato i file per la prima volta non avevo un .m alla fine. Ho provato a rinominare il file e ad aggiungerlo di nuovo, tuttavia dovevo ancora eliminare e ricreare il file prima che xcode fosse soddisfatto.
Odyth

Il tuo file probabilmente non faceva parte del tuo target. La nuova aggiunta probabilmente è finita con una casella di spunta predefinita nella destinazione corretta.
jhoule,

1
Anche questa soluzione ha funzionato per me, ma mi sono assicurato al 100% che prima di eliminare la prima classe (.h + .m), ho verificato che faceva parte del mio obiettivo. Non è stato questo il problema per me. Come Laura, ho appena cancellato il corso e l'ho fatto di nuovo (con un nome diverso), e ha funzionato bene, senza nessuna delle altre soluzioni in questa pagina.
Nate,

7

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

@implementation MyTableViewCell

@end

Quindi è stato causato perché avevo creato un segnaposto @interfaccia per la mia cella di tabella, che aveva una connessione a un elemento nel file .xib, ma c'è un bug in Interface Builder in cui se non viene specificato @implementation per una classe, non riesce a trovarlo.

Avevo seguito tutti i passaggi di altri forum per visualizzare .xib come sorgente e vedere MyTableViewCell anche se l'avevo commentato dal mio codice. Avevo provato a ripristinare il simulatore. Ho anche provato a suddividere tutte le mie classi in file separati denominati come le interfacce, ma nulla ha funzionato fino a questo.

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 :.


6

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

  • Fare clic con il tasto destro del mouse su .xib e selezionare Apri come> Codice sorgente
  • In questo file, cerca il delegato dell'app precedente e sostituiscilo con quello nuovo

Apri come codice sorgente non esiste più, ma puoi semplicemente fare clic con il pulsante destro del mouse, Mostra nel Finder, quindi fare clic con il pulsante destro del mouse sul file e aprirlo in TextEdit. Naturalmente, esegui il backup del file prima di apportare eventuali modifiche;)
Scott Allen,

6

basta aggiungere il codice seguente all'inizio del metodo applicindidfinishlanching appdelegate, quindi funzionerà bene

[classe myclass];


5

Ho provato questo e altri, le risposte elencate in questo sito, nessuna delle quali ha risolto il problema 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 classe cancellata nascosta in un file. Ho dovuto aprire i file del builder dell'interfaccia in X-code, facendo clic con il tasto destro su di essi e scegliendo 'view as source code'. Quindi la ricerca è venuta fuori

<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>

La semplice rimozione di quest'ultima riga non risolve purtroppo il problema, lamentandosi del fatto che nel file è presente un numero errato di elementi. Devi rimuovere la linea corrispondente nella sezione delle linee sopra di essa, che fa riferimento CustomClass.


5

Nel mio caso, ho XCode6, il file .m di classe specificato finisce nella posizione sbagliata nella fase di compilazione - Avrebbe dovuto essere in Compile Sources , ma finire nellaCopia risorse del pacchetto


Grazie a te ho iniziato a guardare l'elenco e ho scoperto che il mio file mancava, probabilmente quando l'ho creato non ho fissato gli obiettivi giusti
schmru,


4

Questo problema non sembra obsoleto.

Ho avuto lo stesso problema con Xcode 8 e l'ho risolto in modo simile a smilebot :

  1. Apri il tuo file storyboard come "Codice sorgente" in Xcode:

  2. Cerca la classe a cui fai riferimento e rimuovi l'intero bit che dice

CustomClass = "UnrecognizedClassName"

  1. Apri di nuovo il file dello storyboard come "interfacebuilder - storyboard" e ricostruisci la tua app.

3

Basta rimuovere MyClass.m e .h e aggiungerli nuovamente al progetto è un lavoro per me.


3

Avevo "Bottone preferito di classe sconosciuto nel file Interface Builder" e l'ho rintracciato in una scena da libro di fiabe in cui il pulsante in questione aveva una falsa classe personalizzata di "Bottone preferito" nel campo Classe nella parte superiore dell'Ispettore identità. Intendevo mettere quel valore nel campo successivo: Etichetta di identità.

La modifica di questo in "UIButton" risolto il problema.



1

Ho riscontrato questo errore oggi durante la conversione della mia app aaLuminate in Universal sotto Xcode 4. Questa app si basa sul modello di utilità ed è stata originariamente creata con Xcode 3.

Per risparmiare tempo ho copiato l'iPhone Main e Flipside Views su nomi appropriati sull'app Universal. Ho riscontrato l'errore "Classe sconosciuta x nel file Interface Builder". Nel mio caso non c'era nulla nei file o nelle destinazioni XIB.

Avevo anche copiato il file aaLuminate-Info.plist per altri motivi: questa aveva una vecchia chiave "Nome base file pennino principale" impostata su MainWindow.

Non appena ho eliminato questa chiave ha risolto il problema!


1

Nel mio caso ho riscontrato questo errore perché avevo cercato di salvare un po 'di lavoro creando un nuovo progetto e quindi eliminando diversi file di origine e copiando i file di origine con lo stesso nome dal progetto di lavoro. Ho anche copiato il mio file MainStoryBoard che stava cercando il mio RootViewController. Tuttavia, quando avevo eliminato il RootViewController originale e poi aggiunto il RootViewController dal prodotto precedente, evidentemente l'operazione Aggiungi file non è riuscita a "selezionare" la casella di destinazione come suggerito sopra. Semplicemente visualizzando tutti i file ".m" importati da Newley e assicurandosi che la casella di appartenenza alla destinazione fosse selezionata, tutto andava bene. Penso che ciò che stava accadendo fosse che il file dello storyboard era alla ricerca di una classe che era stata "esclusa" dal collegamento perché l'appartenenza di destinazione era deselezionata. Accertarsi che i file richiesti per la destinazione siano così designati nell'appartenenza alla destinazione in Controllo file. Grazie Pat! (vedi sopra)


1

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

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


1

Avevo "Classe sconosciuta RateView in Interface Builder" in cui RateView era una sottoclasse di UIView. Avevo lasciato cadere un UIView sulla mia scena Storyboard e avevo cambiato il campo Classe personalizzata in RateView. Tuttavia, questo errore è apparso.

Per eseguire il debug, ho modificato il nome della mia classe in RateView2 e ho modificato tutti i riferimenti in modo che corrispondano ad eccezione del campo Classe personalizzata di UIView. Il messaggio di errore appariva ancora come prima con RateView come classe mancante. Ciò ha confermato che il messaggio di errore era correlato al valore del campo Classe personalizzata. Ho modificato 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 aveva un abbonamento Target. Ho selezionato la casella che ha reso il file del codice sorgente della classe un membro dell'app di destinazione e il messaggio di errore è andato via.


1

Nel mio caso avevo eliminato una classe chiamata "viewController" senza rendermi conto che era stata selezionata con l'ispettore di identità dello storyboard (sotto "Classe personalizzata" in alto).

Devi semplicemente selezionare la classe corretta per il controller di visualizzazione nel campo Classe personalizzata della finestra di ispezione identità o aggiungere una nuova classe al progetto e selezionarla come classe personalizzata.

Ha funzionato per me!



1

Questo mi ha fatto impazzire per un po 'e nessuno dei suggerimenti sopra mi ha aiutato a sbarazzarmi dell'errore. Fortunatamente avevo un solo oggetto IB che utilizzava la classe, quindi l'ho appena cancellato e aggiunto di nuovo con la stessa classe specificata. L'errore è andato via ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.