我有一个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;
当然,如果您的视图控制器中有一个子视图,那么您也可以更改它。