如何实例化自定义iOS UIViewController并在Storyboard下使用它的NIB?

时间:2013-04-01 16:34:48

标签: ios uiviewcontroller storyboard xib nib

StoryBoard setup

我有一个带有StoryBoard(iOS 5+)的项目,带有两个UIViewController。

任务是以编程方式实例化第二个UIViewController(CoordinationController),但我想将它的XIB文件用于用户界面设计。

将XIB复制到StoryBoard的明显解决方法是无效或无法用于未记录的原因。 即使是规则也是如果第二个故事板的视图控制器没有视图,它将查找相同的命名XIB ......不起作用。

如何实例化第二个UIViewController并使用其XIB文件?

2 个答案:

答案 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;
}