单个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
。 它必须与@“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文件
您可以手动加载您的笔尖文件,并分别更改您的视图控制器的view
属性或更改任何视图。
UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile" owner:self options:nil] objectAtIndex:0];
objectAtIndex:0
只在nib文件中只有一个UIView
根对象时才是正确的
加载你的视图后,你可以设置
self.view = someView;
当然,如果你在视图控制器中有一个子视图,那么你也可以改变它。