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, MyClass
viene 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 -ObjC
flag 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 _keepAtLinkTime
metodo. 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 MyClass
sia 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.