2010-06-08 12 views
16

Ho problemi con la mia app universale. Ho impostato il Base SDK su iPhone 3.2 e impostato il target su 3.1.

Ho spostato i file che utilizzano UIPopoverController nei propri file e non dovrebbero essere caricati durante il caricamento dell'app 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 di riferimento da: /var/mobile/Applications/B3B90643 -92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/Biciclette da città attesi in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0 /citybikes.app/citybikes

Spero davvero Qualcuno può aiutarmi.

Con i migliori saluti, Paul Peelen

risposta

27

Anche se non sono caricati in fase di esecuzione, questi file sono comunque gestite nel collegamento. Il simbolo _OBJC_CLASS_$_UIPopoverController viene quindi aggiunto all'app come uno di quelli che richiedono il collegamento dinamico.

Ci sono 2 soluzioni,

  1. sostituire tutte apparenza di UIPopoverController in un messaggio (ad esempio [UIPopoverController alloc]) con NSClassFromString(@"UIPopoverController"), o
  2. Marchio UIKit debolmente legato.
+0

Grazie per la risposta. Cosa intendi con "Fai UIKit debolmente collegato"? La prima sembra logica, ma la cosa migliore sarebbe non cambiare il mio codice, ma non vedo che ciò accada :(. /Paul –

+0

Inoltre, come si dovrebbe prima opzione lavorare nella sezione @interface. per aggiungere e avviare un "UIPopoverController * popoverController;" –

+0

@Paul: non è necessario modificarlo. Solo quelli all'interno di '[...]' devono essere modificati. – kennytm

4

Si consiglia vivamente di non collegare debolmente UIKit. Come KennyTM ed io abbiamo menzionato nei nostri commenti, questo potrebbe nascondere futuri problemi del linker e causare arresti anomali. Inoltre, non sono semplicemente a mio agio nel dire al linker che UIKit è facoltativo quando chiaramente non lo è. Grande hack.

Invece, 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 scrivere un oggetto proxy per gestire questi dettagli di implementazione.

+1

Questo è l'approccio migliore. Comunque, personalmente mi piace usare 'if ([UIPopoverControll class]! = Nil) {...}'. – simonbs

Problemi correlati