我有一个带有StoryBoard(iOS 5+)的项目,带有两个UIViewController。
任务是以编程方式实例化第二个UIViewController(CoordinationController),但我想将它的XIB文件用于用户界面设计。
将XIB复制到StoryBoard的明显解决方法是无效或无法用于未记录的原因。 即使是规则也是如果第二个故事板的视图控制器没有视图,它将查找相同的命名XIB ......不起作用。
如何实例化第二个UIViewController并使用其XIB文件?
答案 0 :(得分:5)
一个非常简单的解决方案是覆盖视图控制器的nibName
属性并返回编码要加载的视图的nib的名称:
- (NSString*) nibName
{
NSLog( @"p.s. this is the nib that the storyboard generated: %@", [super nibName]);
return @"MyViewController";
}
请注意,您可以访问故事板编译器生成的nib的名称,该名称将被使用。此nib包含在app bundle中,打包在storyboard.storyboardc包中。
我有点惊讶你不能从这个nibName实现返回nil并获得加载器使用rules described in the docs搜索nib的默认行为。
或者(这是作弊)您可以通过具有键nibName的用户定义的运行时属性为视图控制器在Storyboard本身中设置所需的nib名称。这是有效的,因为该属性有一个未记录的setter,所以实际上不要这样做!
我认为这是一个比接受的答案更好的解决方案,因为视图将在视图控制器的生命周期的正常过程中加载 - 也就是说,它将在控制器呈现之前延迟加载,并在init中预先显示方法。它代码较少。
答案 1 :(得分:4)
您可以加载nib文件并在一个initWithCoder中设置您的视图:CoordinationController的方法:
-(id)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
UINib *nib = [UINib nibWithNibName:@"CoordinationController" bundle:nil];
NSArray *nibObjects = [nib instantiateWithOwner:self options:nil];
self.view = nibObjects.lastObject;
}
return self;
}