首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >来自情节提要的loadNibNamed

来自情节提要的loadNibNamed
EN

Stack Overflow用户
提问于 2014-04-10 18:07:56
回答 1查看 2.2K关注 0票数 1

场景是这样的:一个简单的应用程序有两个视图控制器类,一个故事板有一个视图控制器。Super继承自UIViewcontroller并实现了-loadView,而另一个视图控制器‘ViewController’则继承自Super。故事板中的视图控制器类是“Sub”。

在代码中:

代码语言:javascript
运行
复制
@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,然后在“Super”控制器中调用-loadView,结果是屏幕是红色的,就像在“Super”中设置的in -loadView一样。

第一个问题是:有没有办法避免“超级”中的-loadView被调用,让“Sub”从故事板获得视图?

如果使用xib而不是故事板,我会在'Sub‘中实现-loadView,以便从xib文件中获取视图,如下所示:

代码语言:javascript
运行
复制
- (void)loadView {
    self.view = [[[NSBundle mainBundle] loadNibNamed:@"SOView" owner:self options:nil] firstObject];
}

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

代码语言:javascript
运行
复制
- (void)loadView {
    if (self.nibBundle && self.nibName) {
        [self.nibBundle loadNibNamed:self.nibName owner:self options:nil];
    }
}

但是它崩溃了:

代码语言:javascript
运行
复制
2014-04-10 11:55:11.872 loadViewTest[8941:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </Users/nlg/Library/Application Support/iPhone Simulator/7.1/Applications/E36DFC3A-4222-4CE4-A954-CC1C3891DCE1/loadViewTest.app> (loaded)' with name 'vXZ-lx-hvc-view-kh9-bI-dsS''
*** First throw call stack:
(
    0   CoreFoundation                      0x017ec1e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x0156b8e5 objc_exception_throw + 44
    2   CoreFoundation                      0x017ebfbb +[NSException raise:format:] + 139
    3   UIKit                               0x004e0b7b -[UINib instantiateWithOwner:options:] + 951
    4   UIKit                               0x004e2ada -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] + 165
    5   loadViewTest                        0x00002cff -[SOSuperViewController loadView] + 319
    6   UIKit                               0x0034a0d3 -[UIViewController loadViewIfRequired] + 78
    7   UIKit                               0x0034a5d9 -[UIViewController view] + 35
    8   UIKit                               0x0026a267 -[UIWindow addRootViewControllerViewIfPossible] + 66
    9   UIKit                               0x0026a5ef -[UIWindow _setHidden:forced:] + 312
    10  UIKit                               0x0026a86b -[UIWindow _orderFrontWithoutMakingKey] + 49
    11  UIKit                               0x002753c8 -[UIWindow makeKeyAndVisible] + 65
    12  UIKit                               0x00225bc0 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 2097
    13  UIKit                               0x0022a667 -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 824
    14  UIKit                               0x0023ef92 -[UIApplication handleEvent:withNewEvent:] + 3517
    15  UIKit                               0x0023f555 -[UIApplication sendEvent:] + 85
    16  UIKit                               0x0022c250 _UIApplicationHandleEvent + 683
    17  GraphicsServices                    0x037e1f02 _PurpleEventCallback + 776
    18  GraphicsServices                    0x037e1a0d PurpleEventCallback + 46
    19  CoreFoundation                      0x01767ca5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    20  CoreFoundation                      0x017679db __CFRunLoopDoSource1 + 523
    21  CoreFoundation                      0x0179268c __CFRunLoopRun + 2156
    22  CoreFoundation                      0x017919d3 CFRunLoopRunSpecific + 467
    23  CoreFoundation                      0x017917eb CFRunLoopRunInMode + 123
    24  UIKit                               0x00229d9c -[UIApplication _run] + 840
    25  UIKit                               0x0022bf9b UIApplicationMain + 1225
    26  loadViewTest                        0x0000309d main + 141
    27  libdyld.dylib                       0x01e33701 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

第二个问题是:有没有可能在没有任何xib文件的情况下使用故事板加载nib?

出于好奇,我刚刚发现self.nibName的值是vXZ-lx-hvc- view -kh9-bI-dsS,在storyboard中的视图控制器的is #object id #-view-# viewcontroller#中视图的对象id。

EN

回答 1

Stack Overflow用户

发布于 2014-04-10 18:17:49

你不能这么做。

在本例中,loadNibName应该加载一个名为SOView.xib的nib。

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

要实例化storybard中的方法,请使用以下方法:

代码语言:javascript
运行
复制
[self.storyboard instantiateViewControllerWithIdentifier:@"myControllerID"];
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22984933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档