2010-04-28 12 views
5

Estoy haciendo una aplicación universal para iPad/iPhone que puede usar el conector de salida VGA del iPad para reflejar el contenido de la aplicación en una pantalla externa. Sin embargo, el iPhone no tiene esta funcionalidad. dado el siguiente código,verificación de iPhone para una constante en tiempo de ejecución en la aplicación universal

#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 

me sale este error en el teléfono en el lanzamiento (funciona bien en IPAD) "dyld: Símbolo no encontrado: _UIScreenDidConnectNotification"

presumiblemente porque existe todavía UIScreenDidConnectNotification duerma' en 3.13 . ¿Cómo verifico esto en tiempo de ejecución?

¡ACTUALIZADO añadido declaraciones ifdef para verificar la interfaz del ipad pero obteniendo el mismo resultado!

ACTUALIZADO añadido declaración NSLog para asegurarse de que no se está llamando al código dentro de la instrucción if. El accidente parece ocurrir antes de ejecutar cualquier otro código ...

+0

está ejecutando la aplicación en un verdadero iPad o en el simulador de iPad? – ohho

+0

aplicación se está ejecutando en un iPhone real- cuando se ejecuta en ipad sim o ipad real el código funciona bien (como se esperaba). – joshue

Respuesta

3

Pruebe el enlace débil UIKit. Añadir en sus otras banderas de enlace:

-all_load -ObjC -weak_framework UIKit

Si el público pre-3.1 dispositivos sino que se refieren a una clase que sólo existe en 3.2, no se puede hacer referencia a ellos por símbolo, tienes que usar NSClassFromString. Pero hay casos en que esto no es posible, p. si subclases dicha clase (digamos UIPopoverController). En esos casos, debe vincular débilmente UIKit. Cuando se vincula débilmente un marco, el cargador dinámico intenta resolver todos los símbolos en el inicio, si falla, se establece en NULL.

Supongo que la constante UIScreenDidConnectNotification no está etiquetada (error), por lo que debe utilizar la misma solución.

Hay una desventaja en los enlaces débiles. Como tiene que hacer esto al inicio, dinámicamente, el tiempo de inicio da un golpe. Tendrás que probar si es demasiado lento para ti.

Otra forma de vincular débilmente un marco es: hacer "Obtener información" en su objetivo y en la pestaña General, verá la lista de marcos. Cambia el tipo de UIKit a Débil.

Por cierto, el uso de un #ifdef para comprobar que no funciona, porque #ifdef son construcciones en tiempo de compilación, por lo que siempre será definido UI_USER_INTERFACE_IDIOM porque usted está construyendo utilizando el SDK 3.2

+0

esto funciona! Agregué esa línea a mi línea "Otros Indicadores del Enlazador" en el diálogo de enlace (¿es ese el lugar correcto?) - ¿puedes decirme qué está haciendo esto y por qué funciona? ¿afectará a algo más en la aplicación? – joshue

+0

gracias por la aclaración ... en este caso no parece afectar demasiado el tiempo de arranque, y estoy de acuerdo, creo que esto es un error (que UIScreenDidConnectNotification no está etiquetado). – joshue

0

Siga la sección "Determinación de programación de dispositivos" en http://iphonedevelopment.blogspot.com/2010/04/converting-iphone-apps-to-universal.html

más

#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 

en la sección de comentarios.

+0

es extraño, pero parece que no funciona. funciona para otras cosas (estoy usando el UI_USER_INTERFACE_IDIOM en otras partes del código para realizar con éxito compilaciones condicionales) pero cuando lo agrego aquí obtengo el mismo problema, todavía se queja de que UIScreenDidConnectNotification no está definido. en tiempo de ejecución, esto no es una advertencia del compilador. – joshue

+0

FYI, copié y pegué su segmento de código en mi proyecto 3.2 y funciona bien en el simulador. extraño ... – ohho

+0

gracias por probar Horace, ¿su proyecto está configurado como una aplicación universal? mi simulador funciona bien porque simula un ipad: tengo este problema cuando se ejecuta en un iPad 3gs funciona bien ... – joshue

0

Otra forma de débil vincular un marco es: hacer "Obtener información" en su objetivo y en la pestaña General, verá la lista de marcos. Cambia el tipo de UIKit a Débil.

Eso funcionó para mí para el problema "Símbolo no encontrado: _UIScreenDidConnectNotification" en el iPhone en tiempo de ejecución.

Cuestiones relacionadas