单个UIViewcontroller,如何在多个xib之间切换?

我有一个UIViewController的子类:

  @interface KBViewController : UIViewController 

以多个xib s为例,一个是Qwerty ,另一个是Dvorak布局:

  KBViewControllerQuerty~iphone.xib KBViewControllerDvorak~iphone.xib 

所以当用户点击一个button时, Qwerty切换到Dvorak 。 正如你所看到的,两种键盘布局的代码逻辑都是相同的。 我需要的是重新加载view与另一个xib

希望Dvorak xib中的所有button都会挂接到KBViewController响应的IBOutlet

在两个xib之间切换的正确方法是什么?

所有的Nib都有指定的File's Owner 。 IBOutlet和IBAction链接是基于File's Owner 。 所以你可以定义一个视图控制器和两个Nib,每个Nib文件的File's Owner设置为定义的视图控制器。

也就是说,如果将所有KBViewController * .xib File's Owner设置为KBViewController,并且在某个位置有一个KBViewController对象,则可以通过initWithNibNamed方法加载所需的KBViewController * .xib(重新创build视图控制器)

如果您应该始终保持相同的KBViewController对象,则可以创build不带Nib的KBViewController对象。 在KBViewController.m中,实现loadView并用-[NSBundle loadNibNamed]方法(以编程方式加载和更改-[NSBundle loadNibNamed]手动加载UIView对象。

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

注意上面的代码中的owner:self 。 它必须与@“SomeNib​​File”的File's Owner相匹配。

要更改已经加载的视图:

 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]; 

更详细的解释: 资源编程指南 – 以编程方式加载Nib文件

您可以手动加载您的笔尖文件,并分别更改您的视图控制器的view属性或更改任何视图。

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

objectAtIndex:0只在nib文件中只有一个UIView根对象时才是正确的

加载你的视图后,你可以设置

 self.view = someView; 

当然,如果你在视图控制器中有一个子视图,那么你也可以改变它。