Ios 从情节提要中命名

Ios 从情节提要中命名,ios,objective-c,storyboard,loadview,Ios,Objective C,Storyboard,Loadview,这就是场景:一个包含两个viewcontroller类的简单应用程序和一个包含一个viewcontroller的故事板。ViewController“Super”继承自UIViewcontroller并实现-loadView,而另一个视图控制器“Sub”继承自“Super”。情节提要中的视图控制器类为“Sub” 代码: @implementation SOSuperViewController - (void)loadView { self.view = [[UIView alloc]

这就是场景:一个包含两个viewcontroller类的简单应用程序和一个包含一个viewcontroller的故事板。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
,以及在“Super”控制器中调用的更高版本-
loadView
,结果是屏幕显示为红色,如在“Super”控制器中的-
loadView
中所设置

第一个问题是:有没有办法避免将“Super”中的-
loadView
称为让“Sub”从故事板获取视图

如果使用xib而不是故事板,我将在'Sub'中实现-
loadView
,以从xib文件获取视图,类似于:

- (void)loadView {
    self.view = [[[NSBundle mainBundle] loadNibNamed:@"SOView" owner:self options:nil] firstObject];
}
但我无法使用故事板知道nib文件的名称,相反,如果设置为,我需要使用nibBundle和nibName属性:

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

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
2014-04-10 11:55:11.872 loadViewTest[8941:60b]***由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在捆绑包中加载NIB:“NSBundle(loaded)”,名称为“vXZ-lx-hvc-view-kh9-bI-dsS”
***第一次抛出调用堆栈:
(
0 CoreFoundation 0x017ec1e4例外预处理+180
1 libobjc.A.dylib 0x0156b8e5 objc_异常_抛出+44
2 CoreFoundation 0x017ebfbb+[N异常提升:格式:][139
3 UIKit 0x004e0b7b-[UINib实例化所有者:选项:][951
4 UIKit 0x004e2ada-[NSBundle(UINSBUNDLEADTIONS)loadNibNamed:owner:options:+165
5 loadViewTest 0x00002CF-[SOSuperViewController loadView]+319
6 UIKit 0x0034a0d3-[UIViewController loadViewIfRequired]+78
7 UIKit 0x0034a5d9-[UIViewController视图]+35
8 UIKit 0x0026a267-[UIWindow AddRootViewControllerServiceWifPossible]+66
9 UIKit 0x0026a5ef-[UIWindow\u setHidden:强制::+312
10 UIKit 0x0026a86b-[UIWindow\u OrderFront不带制作键]+49
11 UIKit 0x002753c8-[UIWindow makeKeyAndVisible]+65
12 UIKit 0x00225bc0-[UIApplication\u CallInitializationDelegatesForRL:有效负载:挂起:][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图形服务0x037e1f02 _PurpleEventCallback+776
18图形服务0x037e1a0d PurpleEventCallback+46
19 CoreFoundation 0x01767ca5\uuuu CFRUNLOOP\u正在调用\uu OUT\uu以执行\uu功能\uuuu+53
20 CoreFoundation 0x017679db\uu CFRunLoopDoSource1+523
21 CoreFoundation 0x0179268c\uuu CFRunLoopRun+2156
22 CoreFoundation 0x017919d3 CFRunLoopRunSpecific+467
23 CoreFoundation 0x017917eb CFRUNLOOPSRUNINMODE+123
24 UIKit 0x00229d9c-[UIU应用程序运行]+840
25 UIKit 0x002BF9B UIApplicationMain+1225
26 loadViewTest 0x0000309d干管+141
27 libdyld.dylib 0x01e33701开始+1
)
libc++abi.dylib:以NSException类型的未捕获异常终止
第二个问题是:是否可以在没有任何xib文件的情况下使用故事板加载nib

出于好奇,我刚刚发现self.nibName的值是vXZ-lx-hvc-view-kh9-bI-dsS,带有故事板中viewcontroller的对象id,viewcontroller中的视图的对象id,哪种看起来正确。

你不能

loadNibName
应该加载一个名为
SOView.xib
的nib

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

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

[self.storyboard instantiateViewControllerWithIdentifier:@"myControllerID"];

检查这个:我知道,这确实是我使用问题中提到的常规xib文件所要做的。但主要的问题是,如果我已经从故事板加载了一个视图,并且我发现好像nibBundle和nibName被填充了,为什么我不能使用我以前在XIB中使用的方法呢?另外,为什么尽管子类在情节提要中有其控制器,却调用super的loadView?另外,视图控制器已经被应用程序本身实例化了。是的,我知道,我不知道为什么你不能,我猜苹果希望我们的故事板只实例化控制器,如果你想处理视图,那么你没有其他选择来创建xib。我在控制器和Storybard中创建视图。但是,当一个视图被使用两次时,我将其放在xib中,重复的视图(甚至在故事板中)会在维护代码时导致问题。嗯