6

我有一个子类UIViewController

 @interface KBViewController : UIViewController

有多个xibs,例如一个是a Qwerty,另一个是Dvoraklayout:

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib

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

希望 中的所有按钮都Dvorak xib将成为响应IBOutlet中的 s 的钩子KBViewController

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

4

2 回答 2

7

所有 Nibs 都有指定的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并手动加载 UIView 对象-[NSBundle loadNibNamed](以编程方式加载和更改 self.view)。

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

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

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

于 2013-01-24T10:19:46.770 回答
0

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

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

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

加载视图后,您可以设置

self.view = someView;

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

于 2013-01-24T08:51:51.897 回答