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

Posted

技术标签:

【中文标题】单个 UIViewcontroller,如何在多个 xib 之间切换?【英文标题】:Single UIViewcontroller, how to switch among multiple xibs? 【发布时间】:2013-01-24 08:30:41 【问题描述】:

我有一个UIViewController 的子类:

 @interface KBViewController : UIViewController

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

 KBViewControllerQuerty~iphone.xib
 KBViewControllerDvorak~iphone.xib

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

希望Dvorakxib 中的所有按钮都将挂钩到KBViewController 中的响应IBOutlets。

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

【问题讨论】:

你的意思是用不同的笔尖重新初始化视图控制器吗?我不认为这是可能的。尝试用新的替换旧的 我想在KBViewController 中替换self.view,并希望Dvorak xib 中的所有按钮都将与KBViewController 的响应IBOutlets 挂钩。 【参考方案1】:

所有笔尖都有指定的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

【讨论】:

【参考方案2】:

您可以手动加载 nib 文件并更改视图控制器的 view 属性或更改您想要的任何视图。

    UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile"
                                                      owner:self
                                                    options:nil] objectAtIndex:0];

只有当您的 nib 文件中只有一个 UIView 根对象时,objectAtIndex:0 才正确

加载视图后,您可以设置

self.view = someView;

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

【讨论】:

这会将新笔尖中的控件挂钩到当前视图控制器的IBOutlets 吗? 不,我不这么认为,但可以为您的 KBViews 编写一个UIView 子类,并将您的 xib 文件中的每个视图链接到该子类。然后,您有一个UIViewController 可以看到您的子类UIView,并且控件与子类挂钩。当您的两个 xib 文件与您的 UIView 子类具有相同的挂钩时,它应该可以按照您的意愿工作。

以上是关于单个 UIViewcontroller,如何在多个 xib 之间切换?的主要内容,如果未能解决你的问题,请参考以下文章