2010-06-16 15 views
20

He convertido una aplicación de iPhone usando el asistente parecido en XCode en una aplicación universal.Cargue dinámicamente la punta para iPhone/iPad dentro del controlador de vista

Se construye muy bien, pero, obviamente, se ve un poco de basura en algunas áreas :)

Es necesario cargar puntas según la cual el dispositivo está siendo utilizado. No deseo crear mis controladores de vista usando initWithNib ya que tengo código para crear los controladores con algunos datos (initWithMyLovelyData) que no tienen nada que ver con la carga de la punta.

sé para averiguar el dispositivo utiliza UI_USER_INTERFACE_IDIOM() así que intentaron anular el initWithNibName dentro de los controladores de vista reales en sí, suponiendo que las llaman internamente alguna manera. Pero no funciona, ya que supongo que no estoy seguro de la sintaxis.

me han tratado

if(ipad..) self = [super initWithNibName:@"MyIpadNib" bundle:nibBundleOrNil]; 

Y eso no funciona:/

EDITAR - Sé que he editado masivamente esto, mi pregunta hecha un poco más específico después de hacer algunas investigaciones más - disculpas!

+0

por cierto, no lo confiesa. – Will

Respuesta

22

EDITAR: @ ​​La respuesta de Adam a continuación es la respuesta correcta.

Para determinar qué plumín cargar, haga lo siguiente y deseche el método initWithMyLovelyData y utilice una propiedad para establecer los datos. Debería poder mover fácilmente todo su código de inicio en el método de establecimiento de propiedades.

MyViewController *viewController; 

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
    viewController = [[MyViewController alloc] initWithNibName:@"ipadNIB" bundle:nil]; 
} else { 
    viewController = [[MyViewController alloc] initWithNibName:@"iphoneNIB" bundle:nil]; 
} 

viewController.myLovelyData = someData; 
+0

Perdón por desenterrar publicaciones antiguas (er) pero: Esto no funciona para mí. ¿Algunas ideas? – Linuxmint

+0

@Linuxmint ¿Qué problema tienes? – kubi

+0

http: // stackoverflow.com/questions/5306346/trouble-with-loading-a-separate-xib-for-ipad-or-iphone – Linuxmint

2

acabo de poner estos dos métodos en una clase llamada IPadHelper, y utilizar el método addIPadSuffixWhenOnIPad para recoger de forma condicional entre dos puntas dependiendo de la plataforma

+ (BOOL)isIPad{ 
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2){ 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){ 
      return YES; 
     } 
    } 
    return NO; 
} 

+ (NSString *)addIPadSuffixWhenOnIPad:(NSString *)resourceName{ 
    if([IPadHelper isIPad]){ 
     return [resourceName stringByAppendingString:@"-iPad"]; 
    } 
    else { 
     return resourceName; 
    } 
} 

ver aquí h ttp://cocoawithlove.com/2010/07/tips-tricks-for-conditional-ios3-ios32.html para más explicación de la primera método ...

+0

El compilador dijo que esto es incorrecto, porque los métodos de Clase deberían devolver objetos (id). Entonces, si crees que será mejor agregar esto al archivo C. – rowwingman

2

Usted puede tener su torta y comerla también. Sólo tiene que añadir un método que envuelve initWithNibName: paquete: y añade el parámetro de myLovelyData:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil myLovelyData:(id)data 
{ 
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) 
    { 
     // Custom initialization using myLovelyData 
     // 
    } 
    return self; 
} 
0

Creo que va a ser mejor para crear el archivo C.
FileHelper.h

#import <Foundation/Foundation.h> 
BOOL isIPad(); 
NSString *addIPadSuffixWhenOnIPad(NSString *resourceName); 

FileHelper.m

#import "FileHelper.h" 
BOOL isIPad() { 
    if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iPhoneOS_3_2) { 
     if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
      return YES; 
     } 
    } 
    return NO; 
} 

NSString *addIPadSuffixWhenOnIPad(NSString *resourceName) { 
    if(isIPad()) { 
     return [resourceName stringByAppendingString:@"-iPad"]; 
    } 
    else { 
     return resourceName; 
    } 
} 
74

En realidad, Apple hace todo esto automáticamente, sólo el nombre de sus archivos NIB:

MyViewController~iphone.xib // iPhone 
MyViewController~ipad.xib // iPad 

y cargar el controlador de vista con el menor cantidad de código:

[[MyViewController alloc] initWithNibName:nil bundle:nil]; // Apple will take care of everything 
+2

si usa esta instrucción: [MyViewController alloc] init]; en el ejemplo anterior, ¿está haciendo exactamente lo mismo? o está haciendo algo ligeramente diferente? – hokkuk

+0

Espero que "init" no haga nada. Si desea que cargue un NIB, debe llamar a initWithNib; de lo contrario, cargar manualmente un NIB del paquete – Adam

+2

[[MyViewController alloc] init] es exactamente lo mismo que [[MyViewController alloc] initWithNibName: nil nibBundle: nil] This se menciona en el archivo UIViewController.h: "Si subclase UIViewController, debe llamar a la implementación súper de este método , incluso si no está utilizando un NIB. (Para su comodidad, el método init predeterminado lo hará por usted , y especifique nil para ambos argumentos de métodos.) " – jsd

Cuestiones relacionadas