No se puede cargar dos plumillas (.XIB) para la class Single ViewController en Xcode 4.5

Lo siento chicos con anticipación, sé que ya hay muchas preguntas similares disponibles. Probé todas las soluciones pero no funcionó ninguna de ellas para mí.

Estoy usando Xcode 4.5.2 y usando dos xibs para iphone5 / ios6 1> RootViewController5 y para todos los otros dispositivos 2> RootViewController, estos dos files de nib tienen ViewController individual llamado RootViewController . En el propietario del file del file nib he seleccionado la class RootViewController en Inspector de class personalizado.

Ahora en el método ViewDidLoad estoy intentando cargar dos nibs como este

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; UIViewController *viewController3; if(result.height == 480) { viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease]; } if(result.height == 568) { viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5" bundle:nil] autorelease]; NSLog(@"iphone 5 123"); } } 

He intentado debajo del código también

  if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; RootViewController *viewController3; if(result.height == 480) { viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease]; } if(result.height == 568) { viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5" bundle:nil] autorelease]; NSLog(@"iphone 5 123"); } } 

Pero sin suerte. Por favor, avise donde me estoy equivocando.

Gracias

Mayur

Te sugiero que hagas algo así:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){ if([UIScreen mainScreen].bounds.size.height == 568.0) { //Use iPhone5 VC self = [super initWithNibName:@"RootViewController-568h" bundle:nibBundleOrNil]; } else{ //Use Default VC self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; } } return self; } 

Eso es si su RootViewController se llama así. Y al hacerlo de esta manera, usted se ahorra de futuras fallas si deciden agregar otro tamaño de un iPhone / iPod. Como está usando dos sentencias if, si ninguna es verdadera, bloqueará la aplicación y no es realmente una buena encoding.

Una buena práctica es intentar siempre pensar en el futuro y planificar el futuro, si deberían liberar otro tamaño de pantalla, no se vería bien, pero al less no se bloquearían.

El problema obvio que veo en su descripción es que establece la class personalizada en "RootViewController" en su nib, pero en realidad está creando una instancia de "UIViewController" en su código.

Lo que debería haber hecho es:

 viewController3 = [[[RootViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease]; 

De lo contrario, cuando el time de ejecución cargue su plumín y esté intentando configurar los puntos de venta específicos de RootViewController en su plumín, el time de ejecución no podrá encontrarlos en un UIViewController vainilla y, por lo tanto, se bloqueará.

No creo que tengas que usar dos .xib diferentes para iPhone5 y iPhone4, 4S, etc. Si quieres cambiar el tamaño de tus imágenes, tags, botones, etc., esa es la razón por la cual se usan Spring y Structs. También puede establecer los tamaños mediante progtwigción utilizando el código que escribió en su pregunta (en sus files .m …)

También he cometido ese error antes. Cuando solía ejecutar el progtwig, siempre se me ocurrió el error

 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "View" nib but the view outlet was not set.' *** First throw call stack:(0x1c93012 0x10d0e7e 0x1c92deb 0xf58c8 0xf5dc8 0xf5ff8 0xf6232 0x453d5 0x4576f 0x45905 0x4e917 0x2b7f 0x12157 0x12747 0x1394b 0x24cb5 0x25beb 0x17698 0x1beedf9 0x1beead0 0x1c08bf5 0x1c08962 0x1c39bb6 0x1c38f44 0x1c38e1b 0x1317a 0x14ffc 0x25fd 0x2525 0x1)libc++abi.dylib: terminate called throwing an exception 

Esto se debe a que "la salida de la punta no estaba configurada"

Por lo tanto, creo que debería utilizar Springs y estructuras o hacerlo mediante progtwigción.

Yo te recomendaría:

use el tablero de historia, en lugar de files XIB cuando crea una instancia de un VC, por ejemplo:

  myVC* vc = [self.storyboard instantiateViewControllerWithIdentifier:@"myVCStoryBoardID"]; [self.navigationController pushViewController:vc animated:YES]; 

Esto ayuda a mantener el layout de VC bajo el mismo techo y a utilizar características poderosas de storyboarding.

Luego, compruebe que el layout automático está activo en los controlleres de su tablero de historia y asegúrese de que las restricciones en una, por ejemplo, la label, se asignan a los límites de otros elementos (muy importantes), arriba y abajo. Esto se materializa con líneas azules con puntos cuando lo mueve. En la mayoría de los casos, el time de ejecución podrá alinear todo, independientemente de la altura de la pantalla.

Entiendo que puede haber algunos casos de borde desagradables en este aspecto, por lo que podría tener que ajustar las cosas manualmente. A less que tenga charts complejos, siempre es posible trabajar con la coorderada Y en el intervalo [0,1], y una vez que debe establecer un marco, utilice [[UIScreen mainScreen] bounds] .size para get el valor apropiado, networkingondeado a el número integer más cercano.

Si todo lo anterior falla, entonces podría tener que crear un VC por separado, pero en mi opinión, eso no es realmente para lo que está destinado el SDK.

¡buena suerte!

Wow, era un tonto, no me di count de que no estaba cargando la punta correctamente. Lo único con lo que estaba equivocado es esta línea de código

Escribí viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5" bundle: nil] autorelease]; en lugar de

  [[NSBundle mainBundle] loadNibNamed:@"RootViewController5" owner:self options:nil]; 

Entonces, mi código final se ve así y funciona absolutamente bien

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { CGSize result = [[UIScreen mainScreen] bounds].size; if(result.height == 480) { // iPhone Classic [[NSBundle mainBundle] loadNibNamed:@"RootViewController" owner:self options:nil]; } if(result.height == 568) { // iPhone 5 [[NSBundle mainBundle] loadNibNamed:@"RootViewController5" owner:self options:nil]; } } 

Gracias a este enlace Enlace a la respuesta correcta