2010-10-02 11 views
9

Me preguntaba si alguien podría decirme, comenzando una nueva aplicación desde cero, cómo organizaría tener una aplicación universal (iPhone/iPad) para iOS. Me di cuenta de que al usar la plantilla predeterminada con el xCode Beta, te da un AppDelegate compartido y un appdelegates subclasificado para iPhone y iPad.Universal iPhone/iPad AppDelegate

Ahora, ¿cómo pones en la lógica para determinar qué aplicación delegada utilizar, cómo sabe con cuál instanciar y trabajar como la plantilla predeterminada no indica. Si tuviera que escribir en la aplicación para iPhoneDelegate, ¿cómo sé que esto solo se ejecutará para el iPhone iOS, por ejemplo?

+1

si está discutiendo el XCode Beta, creo que está bajo NDA ... pero esta pregunta podría ayudar a http://stackoverflow.com/questions/2862537/building-testing-a-universal-iphone-ipad-application –

+0

No es una pregunta específica de xCode Beta, así que ignórelo. – Doz

Respuesta

9

Uso siguiente código

id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate]; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    AppDelegate_iPad *appDelegate = (AppDelegate_iPad *) delegate; 
else 
    AppDelegate_iPhone *appDelegate = (AppDelegate_iPhone *) delegate; 

cada vez que se le requiere para acceder al delegado.

+0

Recibo errores en la 3ª y 5ª líneas en xcode que appDelegate no se declara, y que el "nombre de interfaz inesperado AppDelegate_iPhone (/ iPad): expresión esperada". –

13

Info.plist ("nombre base del archivo de la lista principal") para una aplicación especifica una ventana principal para cargar el archivo .xib, y ese archivo .xib especifica un delegado de aplicación y un controlador de ventana raíz para la aplicación.

El Info.plist para un iPad ("NSMainNibFile ~ ipad") especifica adicionalmente una ventana principal del archivo .xib para el iPad, que puede contener un delegado de aplicación diferente y un controlador de ventana raíz diferente para la aplicación. O podrían ser los mismos, utilizando las pruebas UIUserInterfaceIdiomPad en tiempo de ejecución.

El tiempo de ejecución, que sabe qué tipo de dispositivo se está ejecutando, escoge el archivo .xib inicial correcto para cargar desde el info.plist, y desde allí obtiene el delegado de aplicación correcto y el controlador de la ventana raíz configurados y en ejecución.

2

Variaciones sobre un tema

Crear un archivo COMMON.H

// Global Helpers 
#define APP_DELEGATE() (AppDelegate *)[[UIApplication sharedApplication] delegate] 
#define APP_DELEGATE_IPAD() (AppDelegate_iPad*) [[UIApplication sharedApplication] delegate]; 
#define APP_DELEGATE_IPHONE() (AppDelegate_iPhone*) [[UIApplication sharedApplication] delegate]; 
#define IS_IPAD ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] && [[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 

Importe este COMMON.H/AppDelegate_iPhone.h/AppDelegate_iPad.h /AppDelegate.h en su encabezado precompilado .pch archivo

entonces en su clase sólo tiene que llamar

if (IS_IPAD) { 
     AppDelegate_iPad *appDelegate = APP_DELEGATE_IPAD(); 
}else{ 
    AppDelegate_iPhone *appDelegate = APP_DELEGATE_IPHONE(); 
} 
1

Conti Nuing en la respuesta de Sagar, aquí hay un código que arreglará el comentario de Ryan Wagoner.

id<UIApplicationDelegate> delegate = [[UIApplication sharedApplication] delegate]; 
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    delegate = (AppDelegate_iPad *) delegate; 
else 
    delegate = (AppDelegate_iPhone *) delegate; 

El problema con la respuesta anterior es que en realidad no dan acceso a la variable delegate fuera de la instrucción IF. Este código simplemente arroja la variable original al tipo correcto.

+0

Esto no es útil.¿Por qué se necesitaría el elenco si el delegado se establece de todos modos? Ni siquiera lo declaras como una instancia si diferentes clases. –

Cuestiones relacionadas