Simbolo non trovato: _OBJC_CLASS _ $ _ UIPopoverController
-
25-09-2019 - |
Domanda
Ho dei problemi con la mia app universale. Ho impostato lo SDK Base per iPhone 3.2 e impostare il target a 3,1.
Ho spostato i file che utilizzano l'UIPopoverController per i propri file e non deve essere caricato quando si carica l'applicazione su iPhone. Eppure, quando costruisco la mia app ottengo il seguente errore quando costruire ed eseguire il debug al mio dispositivo:
dyld: Simbolo non trovato: _OBJC_CLASS _ $ _ UIPopoverController Referenced da: /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes Previsto in: /System/Library/Frameworks/UIKit.framework/UIKit nel /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes
Spero davvero che qualcuno mi può aiutare.
Con i migliori saluti, Paul Peelen
Soluzione
Anche se non sono caricati in fase di esecuzione, questi file sono ancora elaborati nel collegamento. Il _OBJC_CLASS_$_UIPopoverController
simbolo viene quindi aggiunto nella vostra applicazione come uno di quelli che richiedono il collegamento dinamico.
Ci sono 2 soluzioni,
- Sostituire ogni apparenza di UIPopoverController in un messaggio (ad esempio
[UIPopoverController alloc]
) conNSClassFromString(@"UIPopoverController")
, o - Fai UIKit debolmente legato.
Altri suggerimenti
Vi consiglio caldamente di non debolmente collegamento UIKit. Come KennyTM e ho citato nei nostri commenti, questo può nascondere futuri problemi di linker e provocare incidenti. Io non sono anche semplicemente dicendo agio con il linker che UIKit è facoltativo quando chiaramente non lo è. Big mod.
Al contrario, inizializzare e chiamare UIPopoverController indirettamente tramite NSClassFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Se avete ancora errori del linker, potrebbe essere necessario chiamare i messaggi di UIPopoverController utilizzando NSSelectorFromString:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Per la portabilità, vi consiglio di scrivere un oggetto proxy per gestire questi dettagli di implementazione.