繁体   English   中英

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

[英]How to instantiate a custom iOS UIViewController and use it's NIB under Storyboard?

StoryBoard设置

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

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

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

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

您可以加载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;
}

一个非常简单的解决方案是覆盖视图控制器的nibName属性并返回编码要加载的视图的nib的名称:

- (NSString*) nibName
{
    NSLog( @"p.s. this is the nib that the storyboard generated: %@", [super nibName]);

    return @"MyViewController";
}

请注意,您可以访问故事板编译器生成的nib的名称,该名称将被使用。 此笔尖包含在应用程序包中,打包在storyboard.storyboardc包中。

我有点惊讶你不能从这个nibName实现返回nil并获得默认行为,其中加载器使用文档中描述规则搜索nib。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM