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

ohh*_*hho 6 cocoa-touch objective-c uiviewcontroller ios

我有一个子类UIViewController:

 @interface KBViewController : UIViewController
Run Code Online (Sandbox Code Playgroud)

xib例如,有多个s,一个是a Qwerty,另一个是Dvorak布局:

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib
Run Code Online (Sandbox Code Playgroud)

因此,当用户单击按钮时,Qwerty切换到Dvorak.如您所见,两种键盘布局的代码逻辑都是相同的.我需要的是重新加载view另一个xib.

希望,所有按钮Dvorak xib都将挂钩到响应IBOutletKBViewController.

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

9da*_*dan 7

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

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

如果你应该一直保持相同的KBViewController对象,你可以创建一个没有Nib的KBViewController对象.在KBViewController.m中,loadView使用-[NSBundle loadNibNamed]方法实现并手动加载UIView对象(以编程方式加载和更改self.view).

UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile"
                                                  owner:self
                                                options:nil] objectAtIndex:0];
self.view = someView;
Run Code Online (Sandbox Code Playgroud)

请注意owner:self上面的代码.它必须与File's Owner@"SomeNib​​File" 匹配.

要更改已加载的视图:

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];
Run Code Online (Sandbox Code Playgroud)

更详细的说明: 资源编程指南 - 以编程方式加载Nib文件