我有UIViewController
的子类:
@interface KBViewController : UIViewController
有多个xib
,例如,一个是Qwerty
,另一个是Dvorak
布局:
KBViewControllerQuerty~iphone.xib
KBViewControllerDvorak~iphone.xib
因此,当用户点击按钮时,Qwerty
会切换到Dvorak
。如您所见,两种键盘布局的代码逻辑都是相同的。我需要的是使用另一个view
重新加载xib
。
希望Dvorak
xib
中的所有按钮都会挂钩到IBOutlet
中的回复KBViewController
。
在两个xib
之间切换的正确方法是什么?
答案 0 :(得分:6)
所有Nib都有指定的File's Owner
。 IBOutlet和IBAction链接基于File's Owner
完成。因此,您可以定义一个视图控制器和两个Nib,每个Nib文件的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];
更详细的解释: Resource Programming Guide - Loading Nib Files Programmatically
答案 1 :(得分:0)
您可以手动加载nib文件并更改视图控制器的view
属性或分别更改所需的任何视图。
UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile"
owner:self
options:nil] objectAtIndex:0];
只有在您的nib文件中只有一个objectAtIndex:0
根对象时UIView
才正确
加载视图后,您可以设置
self.view = someView;
当然,如果您在视图控制器中有子视图,那么您也可以更改它。