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

È stato utile?

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,

  1. Sostituire ogni apparenza di UIPopoverController in un messaggio (ad esempio [UIPopoverController alloc]) con NSClassFromString(@"UIPopoverController"), o
  2. 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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top