Bug Xcode 6: classe sconosciuta nel file Interface Builder


600

Ho eseguito l'upgrade a Xcode 6 beta 4 e ora la mia app si blocca continuamente con il messaggio

Classe sconosciuta X nel file Interface Builder.

Si arresta in modo anomalo perché presumibilmente Xcode non riesce a trovare le mie classi personalizzate che ho collegato nel mio Storyboard ma mostra che sono collegate correttamente nell'interfaccia Xcode.

Sono sicuro che tutto sia collegato correttamente. La mia unica altra opzione potrebbe essere quella di eliminare l'intero file dello storyboard e ricominciare da zero perché potrebbe essere danneggiato in qualche modo.

Modifica: Vorrei anche aggiungere che ho provato a pulire, a resettare il simulatore, a fare confusione con le fasi di costruzione ecc. Niente di tutto ciò funziona.



1
@ ImreKelényi Hai ragione. Questo mi è successo di nuovo di recente dopo aver fatto quello che hai appena descritto.
Epic Byte,

Questo ha funzionato per me, stackoverflow.com/questions/1725881/...
vrunoa

È stato un refuso per me, esegui il debug sull'elemento Control, fino a quando non viene selezionato; Visualizza Controller> ispettore identità> Classe personalizzata> Classe. eliminalo se quella classe non è definita.
Mavericks,

9
NOTARE CHE! Questo "errore" può derivare da origini diverse. Se la risposta accettata non funziona per te, scorri verso il basso e prova la risposta successiva. La risposta corretta per la mia situazione è stata la quinta risposta.
Jacksonkr,

Risposte:


1454

Ho risolto questo problema mentre scrivevo la domanda. Ho pensato di rispondere alla mia domanda e lasciarla qui per chiunque potesse affrontare questo problema quando si utilizza Xcode 6 beta 4.

Per risolvere questo problema, devi selezionare ciascuno dei tuoi oggetti di classe personalizzati in Storyboard (questo include tutte le viste personalizzate, anche i controller di vista personalizzati stessi).

Quindi con quegli oggetti selezionati, apri la finestra di ispezione identità e sotto "Classe personalizzata" dovresti vedere l'opzione Modulo. Fare clic all'interno della casella di testo Modulo e premere Invio.

Questo è tutto! Il modulo corrente per tutti i miei oggetti personalizzati deve essere stato impostato in modo errato internamente in qualche modo in Xcode 6 beta 4. Ma nell'ispettore non c'era alcuna indicazione visiva di ciò.

Se la pressione di invio all'interno della casella di testo del modulo non funziona, prova a selezionare la freccia a destra e seleziona manualmente il modulo corrente, quindi cancella la casella di testo e premi Invio. Puoi anche provare a premere invio all'interno della casella di testo della classe (anche se questo di solito serve a risolvere un problema diverso).

Ecco un'immagine per rendere le cose più chiare: inserisci qui la descrizione dell'immagine


70
Per me, fare clic all'interno di "Modulo" e premere Invio non ha funzionato in modo coerente, ma selezionando il campo "Classe" (e premendo Invio) ha sempre fatto il lavoro.
Imre Kelényi,

2
Per me, l'obiettivo era impostato correttamente, ma la classe non si presentava ancora in IB. Ho notato, tuttavia, che la "Posizione" del file mostrava un percorso "Relativo al progetto" anziché "Relativo al gruppo". Rimuovere il riferimento al file E il gruppo e aggiungerlo di nuovo nella radice del progetto ha funzionato per me.
Knl

8
Wow. Grazie per questo, non penso che ci sarei arrivato altrimenti. Questo risolto un problema che ha iniziato a verificarsi dopo che l'ho aggiunto @objc(...)a una delle mie lezioni Swift.
ndbroadbent,

12
Questo problema è ancora presente in XCode 7.2. Questa soluzione ha funzionato.
Tom Fast,

3
Questo è ancora un problema in Xcode 8.3.1 ... un
vero

99

A volte manca Xcode 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 questo:

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

7
In realtà nel mio caso ho dovuto rimuovere customModuleProvider, quindi l'errore è andato via.
Maciej Swic,

3
Guillermo, ancora in corso su Xcode alla fine di marzo!
Ed Manners,

3
@MaciejSwic La rimozione lo ha customModuleProviderfatto anche per me, grazie!
Sakiboy

1
per quanto riguarda i file xib?
SleepsOnNewspapers

7
Sta ancora accadendo ... sono cose come questa che mi fanno venire voglia di piangere :(
Luca,

72

Ho avuto questo problema dopo aver rinominato una classe rapida. Risolto usando la direttiva @objc:

@objc(ForumTopicListViewController) class ForumTopicListViewController

4
Ciò ha risolto il problema per me, l'ho fatto @objc class Xe ho cambiato lavoro @objc(X) class X.
Joe,

1
Si può anche provare a cancellare i dati derivati vedono stackoverflow.com/questions/24039932/...
user1760527

Ha riscontrato questo problema dopo aver rinominato la classe ViewController predefinita dal modello di progetto Visualizzazione singola. Mi chiedo quale magia sia stata usata in modo che la @objc()direttiva non fosse necessaria per la classe "originale" di ViewController ...
Berend Klein Haneveld,

Vado dalla parte opposta. Avevo specificato il nome del modulo nel file Storyboard ma ho anche aggiunto la direttiva @objc.
WeZZard,

1
Non ha funzionato per me. :( Né la soluzione del nome del modulo funziona.
Mythicalcoder il

64

Progetto con più obiettivi

Nel mio caso sto lavorando a Project con più target e il problema era "eredita da Target" non era selezionato. Selezionando "eredita dalla destinazione" ho risolto il mio problema

inserisci qui la descrizione dell'immagine


Grazie per aver pubblicato questo Risolto il problema che stavo vedendo molto rapidamente.
JaredH

Ho avuto una situazione simile. (XCode 9.4.1) Ho creato un'app iOS denominata FilesTestA, con una UIView personalizzata chiamata MxFileView (che consisteva in MxFileView.swift e MxFileView.xib). Quindi ho aggiunto un altro obiettivo: un widget Oggi ("FilesTestAWidget"). Soluzione per l'utilizzo di MxFileView nel widget: (1) class = "MxFileView"; (2) selezionare "Eredita modulo da destinazione" (o deselezionarlo e inserire manualmente "FilesTestAWidget"); (3) nella destinazione dell'app, assicurarsi che sia MxFileView.swift sia MxFileView.xib includano FilesTestAWidget nella loro iscrizione di destinazione.
Kenster999,

Questo è successo a me su un nuovo progetto dal modello predefinito in Xcode 10.1 (un singolo target dell'app iOS e 2 target test). La casella di controllo era deselezionata per tutti i miei controller di visualizzazione personalizzati (e quindi il testo segnaposto era "Nessuno"). Dopo aver esaminato e selezionato la casella di controllo per ogni controller di visualizzazione personalizzato nel mio storyboard, il problema è stato risolto.
Mason

58

Questo ha funzionato per me ..

Controlla la tua fonte compilata, se quel file (ad esempio; ViewController.m) viene aggiunto o meno, nel mio caso il file ViewController non è stato aggiunto, quindi mi stava dando l'errore.

inserisci qui la descrizione dell'immagine


@CarmenA Devi solo aggiungere file '.m' a Compile Sources. Questa è davvero la soluzione corretta (e unica) per alcuni.
Jacksonkr,

Ho provato diverse altre soluzioni senza fortuna. Questo ha funzionato. Per qualche strana ragione, a un obiettivo mancava l'unico file sorgente che mi stava dando.
galactikuh,

anche per me .. È successo a causa di alcuni che ottengono la risoluzione dei conflitti
Eldhose il

46

Questo può accadere in qualsiasi Xcode sopra 6.0. Mi è successo dopo aver rinominato alcune classi ViewController nel progetto Swift (ma immagino che accadrà anche con Obj-C). Devi solo aprire il builder di interfaccia, andare su Identity Inspector di ViewController che ha rinominato la sua classe, selezionare la classe e premere Invio. Ciò riassegnerà la classe rinominata al ViewController selezionato e ripristinerà anche il valore del modulo che si perde dopo aver rinominato la classe.

Aggiornamento per Xcode 8.1 (probabilmente anche 8.0):

Xcode 8.1 si arresta in modo anomalo. Semplicemente e fastidiosamente si blocca e non stampa nulla. Stavo inseguendo quell'incidente fantasma per un'ora solo per scoprire che era proprio la stessa cosa - classe non assegnata in IB. Se si verificano crash fantasma, ricontrolla prima IB per le classi non assegnate.


grazie per questo. sembra che seguendo il tuo suggerimento, Xcode aggiorni il modulo (sotto la classe in IB) da Nessuno a Attuale. Sto pensando che il problema sia che semplicemente inserendo il nome senza premere Invio non si riesce ad attivare un aggiornamento del modulo tramite Xcode.
rockiesGrizzly

Questo ha funzionato per me. Ho inavvertitamente rinominato una classe di controller, quindi ovviamente non esisteva più al caricamento del controller di visualizzazione.
Litehouse,

32

A volte il controller che stai fornendo perde l'appartenenza di destinazione dall'applicazione corrente. In tal caso, premere invio nel campo "Modulo" non farà nulla. Vai al controller e assicurati che l'appartenenza di destinazione sia impostata sull'app corrente.


Questo è stato il problema anche per me: più target portano al file della classe a non essere incluso accidentalmente nel target che stavo costruendo.
Ryan Kreager,

Ho unito i file e manca questo in uno dei miei obiettivi, ottima risposta
Benjamin Jimenez

Bene, unisci pbx ha rotto i valori di appartenenza target.
sistema

32

L'abilitazione Inherit Module From Targetha richiesto il modulo di destinazione corretto. Ciò ha risolto il problema.

inserisci qui la descrizione dell'immagine


Confermare. Questo mi ha aiutato a risolvere il problema.
Chris8447,

Di solito ho questo problema quando converto un controller di visualizzazione da Objective-C a Swift. Digito nuovamente l'ultima lettera e premo Invio. Dovrebbe fare anche il trucco.
DevNebulae

30

La mia risposta: imposta il modulo personalizzato uguale al nome del pod personalizzato (nel mio esempio - nome della classe personalizzata) come nello screenshot allegato

Questa soluzione è per un caso specifico : per le classi di viste personalizzate da Pod (o Cartagine framework ).

Infrastruttura: XCode8, Swift3

inserisci qui la descrizione dell'immagine


18

L'ho risolto facendo esattamente l'opposto di quanto suggerito da ChikabuZ (grazie per averlo sottolineato, però). Nel file dello storyboard, trova questo:

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

e sostituiscilo con questo:

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

Non riesco a credere quante ore sto perdendo aggirando i bug nel compilatore Swift e Xcode 6


17

Selezionando il giusto Moduleper il mioCustom Class ho risolto questo problema.

Ecco qui :

inserisci qui la descrizione dell'immagine


13

Ho riscontrato questo problema in Xcode 8 , per risolverlo ho dovuto modificare lo storyboard nell'editor di testo.

In generale, cerca il tuo controllo e rimuovi customModuleecustomModuleProvider dall'entità di controllo.

Ha fatto un trucco per me.


Hah! Bello hack :)
Vexy,

10

Ho avuto lo stesso problema.

Nel mio caso, Xcode non stava aggiungendo la mia classe personalizzata a: Target> Build Phase> Compile Sources.

Quindi ti consiglio di verificare se il tuo CustomClass.m è lì.

inserisci qui la descrizione dell'immagine

Spero che questo ti aiuta.


Questo è quello che mi è successo e fortunatamente ho trovato la mia via d'uscita! Stavo venendo qui per rispondere ma tu eri il primo. Grazie!!!
Gabriel Piffaretti,

9

Ho riscontrato questo problema in Xcode 6.1 quando ho rimosso Main.storyboard, il LaunchScreen.xibfile e l'impostazione predefinitaViewController classi dal mio progetto.

Ho risolto eliminando le voci Launch Screen Filee Main InterfacedaInfo.plist



8

Ho cercato su Google ovunque. Nessuna delle risposte funziona per me fino a quando ho incontrato un tizio che mi ha chiesto di spostare la cartella del mio progetto sul desktop. Ha funzionato automaticamente. Apparentemente se hai la cartella del progetto in profondità in molte cartelle, XCODE si rompe effettivamente.


Ho riscontrato di nuovo questo problema in Xcode 7 beta 5 da quando lo avevo già ricevuto in Xcode 6. Questa volta, questo metodo funziona per me.
Jake Lin,

1
In Visual Studio c'è un problema simile. Ma laggiù, riceviamo un messaggio di avvertimento chiaro che dice che il percorso è troppo lungo e le cose non possono essere aggiunte o modificate. Non sono sicuro che sia la stessa cosa con XCODE, ma dopo quell'episodio tengo tutti i miei progetti in documenti o desktop e non ho mai più avuto questo problema. Ho anche dato questo consiglio a qualcuno che utilizza Xamarin Studio e ha funzionato anche per loro ...
VBaarathi

7

Questi passaggi funzionano per me.

1) Cancella i dati derivati.
2) Rimuovere i file .h e .m
3) Creare nuovamente i file .h e .m


Questo ha funzionato anche per me. L'ho persino fatto funzionare senza cancellare i dati derivati.
jaytrixz,

Questo ha funzionato per me, grazie mille Arwin, ma ancora non capisco perché
stia

7

Ho risolto questo problema aprendo il mio file storyboard come codice sorgente e usando command-F per cercare la mia classe sconosciuta ed eliminare la classe personalizzata ad essa associata.


6

Ciò che @gfrs ha detto è corretto, è necessario impostare il modulo. Tuttavia, una volta ho riscontrato un problema che la mia classe non era elencata nel Classmenu a discesa. Alla fine ho rimosso il file rapido, riavviato Xcode e ricreato il file. Alla fine la classe è stata elencata e potrebbe essere utilizzata in Storyboard.

Dai anche un'occhiata a questa risposta , che sembra risolvere il problema "reale" che ho riscontrato.


Rimuovere e aggiungere nuovamente il file di classe ha funzionato per me. Grazie!
Nicolas Miari,

6

Ho risolto questo problema digitando il nome del modulo (sfortunatamente l'elenco a discesa non mostrerà nulla ...) nella classe personalizzata della finestra di ispezione identità per tutto il controller e le visualizzazioni della vista.

Potrebbe inoltre essere necessario indicare il fornitore di destinazione. Per raggiungere questo obiettivo è possibile aprire lo storyboard in modalità codice sorgente e aggiungere l'attributo "customModuleProvider" tra parentesi angolari ViewController e View.


6

La mia soluzione (Xcode 8.1 Swift 3.0):

Classe sconosciuta xxx nel file Interface Builder.

Apri StoryBoard come codice sorgente e cerca xxx . Rimuovi l'attributo che contiene il valore xxx . Costruisci ed esegui.


WTF? Questo è stato assolutamente necessario per me, grazie. Ho dovuto cancellare ilcustomModule="" customModuleProvider=""
Dan Rosenstark l'

1
Se proviamo a pubblicare un'applicazione nell'app store che contiene un errore come questo, l'applicazione viene rifiutata senza pensarci.
ibrahimyilmaz,

Non sono d'accordo. Ho appena inviato una build che ho dovuto modificare in questo modo su TestFlight ed è pronta per il beta test ... vedremo cosa succede sull'app store reale, ma è un bug IMO dell'IB. Grazie!
Dan Rosenstark l'

4

Nel mio caso, ho aggiunto un flag -ObjCalle Other Linker Flagsimpostazioni del progetto per farlo funzionare. Inoltre ho provato con la -all_loadbandiera e ha funzionato bene.

inserisci qui la descrizione dell'immagine


3

Nel mio caso, la classe a cui si fa riferimento nello Storyboard / xib non ha impostato Target Membership .

Per risolvere il problema, assegna a quella classe .he ai .mfile la stessa iscrizione di destinazione delle altre classi.

Nessun set di appartenenza target.


Questo era il mio problema, ma mentre provavo varie soluzioni ho causato il problema risolto dalla risposta di Epic Byte. Devi avere il tuo codice sorgente nella destinazione che stai costruendo, ma anche in IB devi impostare il controller di visualizzazione in modo che faccia parte della destinazione corrente.
SafeFastExpressive

L'appartenenza al target era anche il mio problema, guardato ovunque, ma grazie a questa risposta ho potuto risolverlo.
Borzh,

3

La mia soluzione era quella di rimuovere @objc dalla definizione della classe personalizzata.


2
Qualche esempio con spiegazione sarebbe grandioso.
Nilambar Sharma,

2

Ho affrontato il problema quando ho portato lo storyboard dal progetto Swift al progetto Objective-c, notando la risposta di vvkuznetsov , si è scoperto che i due progetti utilizzavano lo stesso identificatore. I "Prodotto -> Pulizia" e toccare il tasto Invio nel campo di testo Modulo e Classe. il problema è andato via.


2

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 lamenta

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.


2

Il mio problema era un errore dell'utente. Avevo una UIView generica nel mio storyboard e nella sezione Classe personalizzata di Identity Inspector avevo accidentalmente cambiato il nome da UIView a incomprensibile.

Tutto ciò che è stato necessario correggere è stato ripristinarlo in UIView.


Ho fatto la stessa cosa, ma avevo accidentalmente aggiunto il nome dei controller di visualizzazione personalizzati alla sezione della classe personalizzata della vista radice di ViewControllers. Quindi stavo cercando di capire perché View Controller non poteva essere trovato quando era la vista principale per tutto il tempo.
TMin

1

Quello che ha funzionato solo per me è in realtà l'aggiunta del nome del modulo al file xib ...

Quindi, i file xib si presentano così:

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

Soluzione ORRIBILE secondo me, ma è presumibilmente come Apple vuole che lo facciamo ora.

Questa domanda mostra 3 possibili soluzioni nella beta 4 ... a quanto pare, secondo alcuni, Apple non è stata molto utile in questa situazione perché la chiamano "Funzionando come previsto".


1

Ho avuto lo stesso problema con Xcode versione 6.1 (6A1052d). Penso che il problema si presenti se hai rinominato il tuo progetto App / Xcode.

La mia soluzione era quella di aggiungere manualmente il nome del modulo nel generatore di interfaccia.


1

Ho avuto questo problema dopo aver aggiunto una nuova destinazione, quindi ho creato una nuova classe utilizzando la finestra di dialogo "Nuovo file" ma non sono riuscito a controllare accidentalmente la nuova destinazione e la destinazione originale nella finestra di dialogo di creazione, quindi l'oggetto è stato aggiunto solo al mio obiettivo originale. La soluzione era eliminare i file di origine (rimuovi solo riferimento), quindi aggiungerli nuovamente usando "Aggiungi file", questa volta controllando entrambi i target.

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.