单个 UIViewcontroller,如何在多个 xib 之间切换?
Posted
技术标签:
【中文标题】单个 UIViewcontroller,如何在多个 xib 之间切换?【英文标题】:Single UIViewcontroller, how to switch among multiple xibs? 【发布时间】:2013-01-24 08:30:41 【问题描述】:我有一个UIViewController
的子类:
@interface KBViewController : UIViewController
有多个xib
s,例如,一个是Qwerty
,另一个是Dvorak
布局:
KBViewControllerQuerty~iphone.xib
KBViewControllerDvorak~iphone.xib
所以当用户点击一个按钮时,Qwerty
会切换到Dvorak
。如您所见,两种键盘布局的代码逻辑相同。我需要的是用另一个xib
重新加载view
。
希望Dvorak
xib
中的所有按钮都将挂钩到KBViewController
中的响应IBOutlet
s。
在两个xib
s 之间切换的正确方法是什么?
【问题讨论】:
你的意思是用不同的笔尖重新初始化视图控制器吗?我不认为这是可能的。尝试用新的替换旧的 我想在KBViewController
中替换self.view
,并希望Dvorak
xib 中的所有按钮都将与KBViewController
的响应IBOutlet
s 挂钩。
【参考方案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
。它必须与@"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
【讨论】:
【参考方案2】:您可以手动加载 nib 文件并更改视图控制器的 view
属性或更改您想要的任何视图。
UIView *someView = [[[NSBundle mainBundle] loadNibNamed:@"SomeNibFile"
owner:self
options:nil] objectAtIndex:0];
只有当您的 nib 文件中只有一个 UIView
根对象时,objectAtIndex:0
才正确
加载视图后,您可以设置
self.view = someView;
当然,如果您的视图控制器中有子视图,那么您也可以更改它。
【讨论】:
这会将新笔尖中的控件挂钩到当前视图控制器的IBOutlet
s 吗?
不,我不这么认为,但可以为您的 KBViews 编写一个UIView
子类,并将您的 xib 文件中的每个视图链接到该子类。然后,您有一个UIViewController
可以看到您的子类UIView
,并且控件与子类挂钩。当您的两个 xib 文件与您的 UIView
子类具有相同的挂钩时,它应该可以按照您的意愿工作。以上是关于单个 UIViewcontroller,如何在多个 xib 之间切换?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用单个故事板uiviewcontroller为多个子类
是否可以跨多个 UIViewController 使用单个 UIView?
单个 UIViewController 中的多个集合视图未调用 cellForItemAtIndexPath indexPath
具有单个 uiviewcontroller 和多个视图的自动布局 iOS