2010-04-28 6 views
5

Sto realizzando un'app universale per iPad/iPhone che può utilizzare il connettore di uscita VGA dell'iPad per riprodurre il contenuto dell'app su uno schermo esterno. Tuttavia, l'iPhone non ha questa funzionalità. dato il seguente codice,Controllo iPhone per una costante in fase di esecuzione nell'app universale

#ifdef UI_USER_INTERFACE_IDIOM 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    NSLog(@"this code should not execute on iphone"); 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(screenInfoNotificationReceieved:) 
      name:UIScreenDidConnectNotification 
      object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self 
     selector:@selector(screenInfoNotificationReceieved:) 
      name:UIScreenDidDisconnectNotification 
      object:nil]; 
} 
#endif 

ottengo questo errore al telefono al momento del lancio (funziona bene in iPad) "dyld: Simbolo non trovato: _UIScreenDidConnectNotification"

presumibilmente perché UIScreenDidConnectNotification doesnt' esiste ancora in 3.13 . Come posso verificarlo durante il runtime?

AGGIORNATO aggiunto istruzioni ifdef per verificare l'interfaccia di ipad ma ottenere lo stesso risultato!

AGGIORNATO aggiunto dichiarazione NSLog per assicurarsi che il codice all'interno l'istruzione if non viene chiamato. L'incidente sembra verificarsi prima dell'esecuzione di qualsiasi altro codice ...

+0

è l'applicazione in esecuzione su un vero e proprio iPad o nel simulatore iPad? L'app – ohho

+0

è in esecuzione su un vero iPhone: quando viene eseguito in ipad sim o ipad reale, il codice funziona correttamente (come previsto). – joshue

risposta

3

Prova collegamento debole UIKit. Aggiungere nella vostra altre bandiere di collegamento:

-all_load -ObjC -weak_framework UIKit

Se il target pre-3.1 dispositivi, ma fa riferimento a una classe che esiste solo in 3.2, non è possibile fare riferimento a loro dal simbolo, devi usare NSClassFromString. Ma ci sono casi in cui ciò non è possibile, ad es. se si sottoclasse una classe del genere (ad esempio UIPopoverController). In questi casi devi collegare debitamente UIKit. Quando si esegue il collegamento debole di un framework, il caricatore dinamico tenta di risolvere tutti i simboli all'avvio, se non riesce, viene impostato su NULL.

Suppongo che la costante UIScreenDidConnectNotification non sia contrassegnata (bug), quindi è necessario utilizzare la stessa soluzione alternativa.

C'è uno svantaggio per il collegamento debole. Dal momento che deve farlo all'avvio, in modo dinamico, il tempo di avvio ha un successo. Dovrai testare se è troppo lento per te.

Un altro modo per collegare un frame debole è: fare "Ottieni informazioni" sul target e sotto la scheda Generale, verrà visualizzato l'elenco di framework. Cambia il tipo di UIKit in Debole.

BTW, utilizzando un #ifdef per controllare non funziona, perché #ifdef sono costrutti in fase di compilazione, in modo UI_USER_INTERFACE_IDIOM sarà sempre definita perché si sta costruendo con il 3.2 SDK

+0

funziona! Ho aggiunto questa linea alla mia linea "Altri Linker Flags" nella finestra di dialogo di collegamento (è il posto giusto?) - puoi dirmi cosa sta facendo e perché funziona? influenzerà qualcos'altro nell'app? – joshue

+0

grazie per il chiarimento ... in questo caso non sembra avere un impatto negativo sul tempo di avvio - e sono d'accordo - penso che questo sia un bug (che UIScreenDidConnectNotification non è taggato). – joshue

0

Seguire la sezione "programmazione Determinazione del dispositivo" a http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html

più

#ifndef __IPHONE_3_2 // if iPhoneOS is 3.2 or greater then __IPHONE_3_2 will be defined 
    typedef enum { // provided by noblemaster ]:-| 
    UIUserInterfaceIdiomPhone, // iPhone and iPod touch style UI 
    UIUserInterfaceIdiomPad, // iPad style UI 
    } UIUserInterfaceIdiom; 
    #define UI_USER_INTERFACE_IDIOM() (([[UIDevice currentDevice].model rangeOfString:@"iPad"].location != NSNotFound) ? UIUserInterfaceIdiomPad : UIUserInterfaceIdiomPhone) 
#endif // ifndef __IPHONE_3_2 

nella sezione commenti.

+0

è strano ma non sembra funzionare. funziona per altre cose- (Sto usando l'UI_USER_INTERFACE_IDIOM in altre parti del codice per eseguire correttamente le compilazioni condizionali) ma quando lo aggiungo qui ottengo lo stesso problema, si lamenta ancora che UIScreenDidConnectNotification non sia definito. in fase di esecuzione, questo non è un avviso del compilatore. – joshue

+0

FYI, ho copiato e incollato il segmento di codice nel mio progetto 3.2 e gira bene nel simulatore. strano ... – ohho

+0

grazie per aver testato Horace, il tuo progetto è impostato come app universale? il mio simulatore funziona bene perché simula un ipad: sto avendo questo problema quando gira su un 3gs-ipad funziona bene ... – joshue

0

Un altro modo di debolezza collegare un frame è: fai "Ottieni informazioni" sul tuo obiettivo e sotto la scheda Generale, vedrai la lista dei quadri. Cambia il tipo di UIKit in Debole.

Che ha funzionato per me per il problema "Simbolo non trovato: _UIScreenDidConnectNotification" su iPhone in fase di esecuzione.

Problemi correlati