单个 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 之间切换?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用单个故事板uiviewcontroller为多个子类

是否可以跨多个 UIViewController 使用单个 UIView?

单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath

具有单个 uiviewcontroller 和多个视图的自动布局 iOS

如何有条件地从单个 UITabBar 项目中选择 UIViewController 并保持 TabBar 可见

在单个视图控制器上支持多个方向