如何实例化自定义iOS UIViewController并在Storyboard下使用它的NIB?
如何实例化自定义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;
}
一个非常简单的解决方案是重写视图控制器的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方法。这是更少的代码。
我有一个问题,我需要显示多个.xibs,但只使用一个视图控制器。我用这个和一个单身人士解决了它。 .xib名称在singleton属性NSString * xibName中设置。然后视图控制器从故事板实例化。内部 - (NSString *)nibName我添加了一行并返回了xibName。完美工作。 –
没关系,谢谢,但我想看看FirstViewController的实例化。只是一个额外的问题:它可以与segue一起工作吗? – BootMaker
@BootMaker,我不明白你的意思。 FirstViewController也是CoordinationController的子类吗? – rdelmar
不,它是一个不同的控制器,实际上是第一个控制器或RootController,但它很重要,它如何实例化CoordinationController。 – BootMaker