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

问题描述:

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

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

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

将XIB复制到StoryBoard中的显而易见的解决方法由于无证件原因而不起作用或不可用。 即使规则是,如果第二个故事板的视图控制器没有视图,它会寻找同名的XIB ...不起作用。

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

您可以加载笔尖文件,并设置在的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; 
} 
+0

没关系,谢谢,但我想看看FirstViewController的实例化。只是一个额外的问题:它可以与segue一起工作吗? – BootMaker

+0

@BootMaker,我不明白你的意思。 FirstViewController也是CoordinationController的子类吗? – rdelmar

+0

不,它是一个不同的控制器,实际上是第一个控制器或RootController,但它很重要,它如何实例化CoordinationController。 – BootMaker

一个非常简单的解决方案是重写视图控制器的nibName财产和返回笔尖编码的名称认为你想装:

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

    return @"MyViewController"; 
} 

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

我有些惊讶,你不能从这个nibName实现返回nil,并得到加载程序使用rules described in the docs搜索nib的默认行为。

或者(这是作弊),您可以通过用户定义的运行时属性和键名nibName在视图控制器的故事板本身中设置所需的nib名称。这是有效的,因为有一个没有记录的二传手,所以不要这样做!

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

+0

我有一个问题,我需要显示多个.xibs,但只使用一个视图控制器。我用这个和一个单身人士解决了它。 .xib名称在singleton属性NSString * xibName中设置。然后视图控制器从故事板实例化。内部 - (NSString *)nibName我添加了一行并返回了xibName。完美工作。 –