单个UIView控制器,如何在多个xib之间切换



我有一个UIViewController的子类:

 @interface KBViewController : UIViewController

例如,对于多个xib,一个是Qwerty,另一个是Dvorak布局:

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib

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

希望Dvorak xib中的所有按钮都将钩到KBViewController中的响应IBOutlet

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

所有笔尖都有指定的File's Owner。IBOutlet和IBAction链接是基于File's Owner完成的。因此,您可以定义一个视图控制器和两个笔尖,并将每个笔尖文件的File's Owner设置为定义的视图控制器。

也就是说,如果您将所有 KBViewController*.xib 文件的File's Owner设置为 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;

注意上面的代码中的owner:self。它必须与@"SomeNibFile"的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 文件

您可以

手动加载 nib 文件并分别更改视图控制器的 view 属性或更改所需的任何视图。

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

仅当 nib 文件中只有一个 UIView 根对象时,objectAtIndex:0才正确

加载视图后,您可以设置

self.view = someView;

当然,如果您的视图控制器中有一个子视图,那么您也可以更改它。

最新更新