来自故事板的loadNibNamed

时间:2014-04-10 10:07:56

标签: ios objective-c storyboard loadview

这是一个场景:一个带有两个viewcontroller类的简单应用程序和一个带有1个viewcontroller的storyboard。 ViewController' Super'继承自UIViewcontroller并实现 - loadView和其他视图控制器,' Sub'继承自' Super'。故事板中的视图控制器类是' Sub'。

在代码中:

@implementation SOSuperViewController
- (void)loadView {
    self.view = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.view.backgroundColor = [UIColor redColor];
    NSLog(@"%@=> %@", NSStringFromClass([self superclass]), NSStringFromSelector(_cmd));
} 
@end

@implementation SOSubViewController
- (void)awakeFromNib {
    //Outlets are lazy loaded so self.view it is not really set here
    [super awakeFromNib];

    NSLog(@"%@=> %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
}

@end

故事板中视图控制器的类是SOSubViewController。执行应用时,您可以看到 - ' Sub'中调用了awakeFromNib。控制器及更高版本 - '超级'控制器,结果是屏幕为红色,如“超级'”中的loadView所示。

第一个问题是:有没有办法避免 - loadView超级'被称为让'Sub'从故事板中获取视图?

如果使用xibs而不是故事板,我会在' Sub'中实现 - loadView。从xib文件中获取视图,如:

loadView

但我无法使用故事板知道nib文件的名称,相反,如果设置,我需要使用nibBundle和nibName属性:

- (void)loadView {
    self.view = [[[NSBundle mainBundle] loadNibNamed:@"SOView" owner:self options:nil] firstObject];
}

但是崩溃了:

- (void)loadView {
    if (self.nibBundle && self.nibName) {
        [self.nibBundle loadNibNamed:self.nibName owner:self options:nil];
    }
}

第二个问题是:是否可以使用没有任何xib文件的故事板加载笔尖?

作为好奇心,我刚刚发现self.nibName的值是vXZ-lx-hvc-view-kh9-bI-dsS,故事板中的viewcontroller是#object id#-view-#object id for the view in viewcontroller#哪种看起来正确。

1 个答案:

答案 0 :(得分:3)

你不能。

loadNibName应该在你的案例中加载一个名为SOView.xib的笔尖。

如果您只想加载视图,可以在单独的xib文件中创建视图,但是当我们处理故事板时,我们只在其中添加UIViewController(当然,可以包含自定义视图。)

要从故事栏中实例化方法,请使用以下方法:

[self.storyboard instantiateViewControllerWithIdentifier:@"myControllerID"];
相关问题