UIViewcontroller único, ¿cómo cambiar entre múltiples xibs?

Tengo una subclass de UIViewController :

  @interface KBViewController : UIViewController 

con múltiples xib s, por ejemplo, uno es un Qwerty y el otro es el layout de Dvorak :

  KBViewControllerQuerty~iphone.xib KBViewControllerDvorak~iphone.xib 

Entonces cuando el usuario hace clic en un button, Qwerty cambia a Dvorak . Como puede ver, la lógica del código es idéntica para ambos layouts de keyboard. Lo que necesito es volver a cargar la view con otro xib .

Con suerte, todos los botones en el Dvorak xib serán ganchos para el IBOutlet s que responde en KBViewController .

¿Cuál es la forma correcta de cambiar entre los dos xib s?

All Nibs tiene el File's Owner designado. El enlace IBOutlet y IBAction se realiza en function File's Owner . Por lo tanto, puede definir un controller de vista y dos Nibs, con el propietario del file del file Nib establecido en el controller de vista definido.

Es decir, si configura File's Owner del File's Owner de todos los files KBViewController * .xib en KBViewController y tiene un object KBViewController en algún lugar, puede cargar el KBViewController * .xib que desee mediante el método initWithNibNamed ( initWithNibNamed crear el controller de vista)

Si debe mantener el mismo object KBViewController todo el time, puede crear un object KBViewController sin Nib. En KBViewController.m, ejecute loadView y cargue manualmente el object UIView con el método -[NSBundle loadNibNamed] (cargue y cambie self.view mediante progtwigción).

 UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" owner:self options:nil] objectAtIndex:0]; self.view = someView; 

Tenga en count el owner:self en el código anterior. Debe coincidir con File's Owner del File's Owner @ "SomeNibFile".

Para cambiar la vista ya cargada:

 id superview = self.view.superview; [self.view removeFromSuperview]; UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" owner:self options:nil] objectAtIndex:0]; self.view = someView; [superview addSubview:self.view]; 

Explicación más detallada: Guía de progtwigción de resources: carga de files de plumillas de forma programática

Puede cargar manualmente su file de nib y cambiar el atributo de vista de su controller de vista o cambiar cualquier vista que desee, respectivamente.

  UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" owner:self options:nil] objectAtIndex:0]; 

objectAtIndex:0 solo es correcto cuando solo hay un object raíz UIView en su file nib

Después de cargar su vista, puede configurar

 self.view = someView; 

Por supuesto, si tiene una subvista en su controller de vista, también puede cambiar eso.