2

故事板设置

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

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

由于未记录的原因,将 XIB 复制到 StoryBoard 的明显解决方法不起作用或不可用。甚至规则是,如果第二个故事板的视图控制器没有视图,它将寻找同名的 XIB... 不起作用。

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

4

2 回答 2

5

您可以加载 nib 文件并在 CoordinationController 的 initWithCoder: 方法中设置视图:

-(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;
}
于 2013-04-01T16:59:27.390 回答
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 并获得加载程序使用文档中描述的规则搜索 nib 的默认行为。

或者(这是作弊)您可以通过带有键 nibName 的用户定义的运行时属性在 Storyboard 本身中为视图控制器设置所需的 nib 名称。这是有效的,因为该属性有一个未记录的设置器,所以实际上不要这样做!

我认为这是一个比公认答案更好的解决方案,因为视图将在视图控制器生命周期的正常过程中加载 - 也就是说,它将在控制器出现之前延迟加载,而不是在 init 方法中预先加载。而且代码更少。

于 2014-01-10T00:50:04.350 回答