单UIViewcontroller,如何在多个xib之间切换?

时间:2013-01-24 08:30:41

标签: ios objective-c cocoa-touch uiviewcontroller

我有UIViewController的子类:

 @interface KBViewController : UIViewController

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

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib

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

希望Dvorak xib中的所有按钮都会挂钩到IBOutlet中的回复KBViewController

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

2 个答案:

答案 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。它必须与@“SomeNib​​File”的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;

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