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

Ios 单UIViewcontroller,如何在多个XIB之间切换?,ios,objective-c,cocoa-touch,uiviewcontroller,Ios,Objective C,Cocoa Touch,Uiviewcontroller,我有一个子类UIViewController: @interface KBViewController : UIViewController 例如,对于多个xibs,一个是Qwerty,另一个是Dvorak布局: KBViewControllerQuerty~iphone.xib KBViewControllerDvorak~iphone.xib 因此,当用户单击按钮时,Qwerty将切换到Dvorak。如您所见,两种键盘布局的代码逻辑是相同的。我需要的是用另一个xib重新加载视图 希

我有一个子类
UIViewController

 @interface KBViewController : UIViewController
例如,对于多个
xib
s,一个是
Qwerty
,另一个是
Dvorak
布局:

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib
因此,当用户单击按钮时,
Qwerty
将切换到
Dvorak
。如您所见,两种键盘布局的代码逻辑是相同的。我需要的是用另一个
xib
重新加载
视图

希望
Dvorak
xib
中的所有按钮都能挂接到
KBViewController
中响应的
IBOutlet


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

您可以手动加载nib文件,并分别更改视图控制器的
视图属性或更改所需的任何视图

    UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile"
                                                      owner:self
                                                    options:nil] objectAtIndex:0];
只有当nib文件中只有一个
UIView
根对象时,
objectAtIndex:0
才是正确的

加载视图后,可以设置

self.view = someView;

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

所有NIB都有指定的
文件所有者。IBOutlet和IBAction链接是基于
文件的所有者来完成的。因此,您可以定义一个视图控制器和两个Nib,将每个Nib文件的
文件所有者设置为定义的视图控制器

也就是说,如果将所有KBViewController*.xib文件的
文件所有者
设置为KBViewController,并且在某个位置具有KBViewController对象,则可以通过
initWithNibNamed
方法加载所需的KBViewController*.xib(重新创建视图控制器)

如果您应该始终维护同一个KBViewController对象,则可以创建一个没有Nib的KBViewController对象。在KBViewController.m中,实现
loadView
,并使用
-[NSBundle loadNibNamed]
方法手动加载UIView对象(以编程方式加载和更改self.view)

注:上述代码中的所有者:self
。它必须与@“SomeNibFile”的
文件所有者
匹配

要更改已加载的视图,请执行以下操作:

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重新初始化视图控制器吗?我认为这是不可能的。试着用新的替换旧的。我想替换
KBViewController
中的
self.view
,希望
Dvorak
xib中的所有按钮都连接到
KBViewController
的响应
IBOutlet
s。这会将新nib中的控件连接到当前系统的
IBOutlet
s吗视图控制器?不,我不这么认为,但是可以为KBView编写一个
UIView
子类,并将xib文件中的每个视图链接到此子类。然后,您有一个带有子类视图的
UIViewController
,并且控件连接到子类。当两个xib文件对
UIView
子类具有相同的钩子时,它应该按照您的意愿工作。
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];