2012-03-17 16 views
6

He estado tratando de descubrir por qué ha sucedido esto, pero parece que, en la versión iPad de mi aplicación universal, está cargando el .xib de iPhone en lugar del iPad uno.Aplicación universal para iPad que no carga archivos .xib para iPad?

He nombrado mi iPhone xibs con un sufijo de ~ iphone.xib y dejé mis iPad solo con .xib. Leí para hacer eso porque alguien dijo que funcionó para ellos, pero en mi caso no funcionó para mí.

Incluso si hago ~ ipad.xib y ~ iphone.xib para los diferentes archivos .xib, ¡aún carga la versión de iPhone!

* * ¿Hay alguna manera de confirmar completamente que está cargando la versión de iPhone en lugar de la versión de iPad?

Y ¿hay alguna manera de solucionar este problema para que el iPad carga los .xibs iPad? **

Gracias!

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 

// Override point for customization after application launch. 
    self.viewController = [[[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]] autorelease]; 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

que hace el trabajo para mí ... Extraño. Pero, ¿es la aplicación realmente universal? ¿Corre en "pantalla completa"? – fbernardo

+0

Sí, sí funciona en pantalla completa. Las familias de dispositivos en la configuración del proyecto y la configuración de destino son ambas "iPhone/iPad". ¿Usas dos sufijos diferentes o de qué otra manera usas? –

+0

Controlador ~ ~ ipad.xib y controlador iphone.xib y luego en el código acabo de llamar [[Controlador alloc] initWithNibName: @ "Controller" paquete: nil]; – fbernardo

Respuesta

4

En mi aplicación, lo hago así. Creo archivos .h, .m y XIB separados para las vistas de iPad y luego en AppDelegate simplemente hago una condición if, que decide qué controlador de vista mostrará.
Por cierto. No uso esos sufijos en XIB, los nombro a lo que quiero.

archivo Mi AppDelegate.h (una parte de ella)

@class FirstViewController; 
@class FirstIpadViewController;  
....... 
....... 
@property (nonatomic, retain) IBOutlet FirstViewController *viewController; 
@property (nonatomic, retain) IBOutlet FirstIpadViewController *ipadViewController; 

Mi archivo AppDelegate.m (una parte de ella)

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
} else { 
    self.window.rootViewController = self.ipadViewController; 
    [self.window makeKeyAndVisible]; 
} 

Esto definitivamente debe hacerlo. Sólo cambia la clase y la propiedad en el archivo .h, a su controlador de vista y usted debe ser bueno para ir :)

EDITAR

acabo de encontrar la manera de hacerlo. Y las convenciones de nomenclatura adecuadas son _iPhone y iPad. Esto es básicamente lo mismo que publiqué anteriormente, solo el cambio es que tendrá los mismos archivos .h y .m, pero diferentes XIB.

En el AppDelegate .m el archivo

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    // Override point for customization after application launch. 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 
     self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil]; 
    } else { 
     self.viewController = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil]; 
    } 
    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 
+0

Tristemente uso una clase para ambos xibs, entonces, ¿cómo podría hacer esta solución con eso? Además, no tengo un mainWindow.xib para conectar los IBOutlets, solo lo conecto programáticamente. –

+0

Ok, acabo de enterarme. Actualizado el código en la respuesta :) –

+0

¡Oh, ya veo! Entonces, ¿no es ~ iphone.xib y ~ ipad.xib sino que es _iPhone.xib y _iPad.xib? –

0

Esta solución funciona con guiones gráficos durante el uso de sus propios xibs personalizados. Se vuelve a utilizar las mismas .h & archivos .m para los puntos de vista:

  • ViewController.h
  • ViewController.m
  • ViewController.xib
  • ViewController ~ iPad.xib

En su archivo ViewController.m agregue:

- (id)initWithCoder:(NSCoder *)aDecoder 
    { 
     if (self) 
     { 
      NSString* nibName = NSStringFromClass([self class]); 
      if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
      { 
       self = [super initWithNibName:nibName bundle:nil]; 
      } 
      else if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
      { 
       self = [super initWithNibName:[nibName stringByAppendingString:@"~iPad"] bundle:nil]; 
      } 
      return self; 
     } 
     return self; 
    } 

Simplemente compruebe que las xib tengan configurado el nombre de la clase personalizada del controlador de vista del propietario del archivo y el conjunto de vistas de la vista.

Cuestiones relacionadas