2010-05-03 18 views
10

Estoy trabajando en una nueva aplicación que quiero que sea universal para iPhone y iPad. Comencé con el asistente "Crear una aplicación basada en una ventana" y creé delegados de aplicaciones por separado en los grupos "iPhone" y "iPad". Como ya estaba bastante familiarizado con el desarrollo de iPhone, hice esa parte de mi proyecto, y ahora estoy listo para hacer algunas cosas de iPad.¿Cómo ejecuto una aplicación universal en el simulador de iPhone 3.1.3?

Así que ... Empecé agregando un UISplitViewController a mi delegado de iPad, cambio el Active SDK a 3.2, ¡y funciona! Pero cuando vuelvo a 3.1.3 y trato de ejecutarlo en el simulador, Build and Go falla. Para empezar, veo:

...path.../iPad/AppDelegate_Pad.h:13: error: expected specifier-qualifier-list before 'UISplitViewController'

Tengo mi juego de Base SDK a 3.2 y mi despliegue de destino establecido en 3.1.3. Pensé que eso era suficiente. Pero también he encontrado en la documentación este método para compilar condicionalmente:

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200 
    MyIPadViewController* vc; 
// Create the iPad view controller 
#else 
    MyIPhoneViewController* vc; 
// Create the iPhone view controller 
#endif 

¿Debo hacer esto en todas partes? Parece que hay que agregar un montón de código (que de todos modos me desharé en poco tiempo para 4.0), así que siento que debo estar haciendo algo mal. Y, ni siquiera tengo idea de cómo funciona esto para cosas como @property o @synthesize declaraciones.

tl; versión de dr de la pregunta - ¿Extraño un ajuste en alguna parte?

+0

La respuesta por progrmr es más apropiada, acéptela para que los lectores puedan obtener la respuesta correcta fácilmente. –

Respuesta

23

Todo lo contrario. Una aplicación universal ejecuta el mismo binario en iPhone y iPad, por lo que no puede usar la compilación condicional para diferenciar entre las dos versiones. Pero hay que utilizar la macro de Apple cita en la documentación:

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    // iPad-specific code 
} else { 
    // iPhone-specific code 
} 
+0

Entonces, ¿cómo agrego algo así como un archivo de encabezado, donde estoy declarando una variable de tipo UISplitViewController? Se supone que tengo un bloque if/else en él? – bpapa

+0

No, solo puede declararlo. Build for iPhone Device 3.2 y se ejecutará en su dispositivo 3.0/3.1. –

+0

Los bloques de compilación condicional son útiles si desea probar su aplicación en el simulador de iPhone 3.1, porque (el simulador 3.2 no admite la ejecución de una aplicación universal en modo iPhone). –

39

utilizo esta función C para ayudar a mantener el código concisa:

BOOL isPad() { 
    return (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad); 
} 

Otra cosa que hago, cuando tengo diferentes archivos xib para iPhone vs iPad. Tengo una función stripPadSuffixOnPhone() que ayuda a mantener el código más simple:

// Load/create the Delete table cell with delete button 
self.deleteCell = [Utilities loadNib:stripPadSuffixOnPhone(@"DeleteCell~ipad") 
          ClassName:@"DeleteCell" 
        Owner:self]; 

Cosas así pueden hacer de codificación menos condicionales más sencillo y mucho. Todavía tengo que probar todo dos veces.

+0

¡Será genial si comparte su clase 'Utilities' con nosotros! : P :);) – rptwsthi

+2

Están en [github] (https://github.com/progrmr/SDK_Utilities/tree/master/Utils) – progrmr

0

Aquí es lo que funciona para mí:

  1. Construye tu aplicación utilizando SDK 3.2.
  2. Cambie el SDK activo a iPhone Simulator 3.1.3 (o lo que sea).
  3. En el menú Ejecutar, seleccione Depuración (no compilación y depuración).

El binario construido en 3.2 se instalará en el simulador 3.x sin reconstrucción. Cuando haya terminado, no olvide volver a establecer su SDK activo en 3.2.

+0

La instalación en stock del SDK 3.2 elimina los SDK 3.1.x, por lo que no puede configurarlos como el SDK activo. –

Cuestiones relacionadas