gpt4 book ai didi

ios - loadNibNamed 从 Storyboard

转载 作者:行者123 更新时间:2023-12-01 19:00:58 25 4
gpt4 key购买 nike

这是场景:一个简单的应用程序,有两个 View Controller 类和一个带有 1 个 View Controller 的 Storyboard。 ViewController 'Super' 继承自 UIViewcontroller和实现 - loadView另一个 View Controller “Sub”继承自“Super”。 Storyboard中的 View Controller 类是“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

Storyboard中 View Controller 的类是 SOSubViewController .执行应用程序时,您可以看到 - awakeFromNib在“子” Controller 及更高版本中调用 - loadView在 'Super' Controller 中调用,结果是屏幕是红色的 - loadView在“ super ”中。

第一个问题是:有什么办法可以避免- loadView在“ super ”中被称为让“子”从 Storyboard中获取 View ?

如果使用 xibs 而不是 Storyboard,我将实现 - loadView在“子”中从 xib 文件中获取 View ,例如:
- (void)loadView {
self.view = [[[NSBundle mainBundle] loadNibNamed:@"SOView" owner:self options:nil] firstObject];
}

但是我不知道使用 Storyboard 的 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

第二个问题是:是否可以在没有任何 xib 文件的情况下使用 Storyboard 加载 nib?

出于好奇,我刚刚发现 self.nibName 的值是 vXZ-lx-hvc-view-kh9-bI-dsS ,其中 #object id 用于 Storyboard中的 View Controller #-view-#object id 用于 View Controller 中的 View #哪种看起来对。

最佳答案

你不能。
loadNibName应该加载一个名为 SOView.xib 的 Nib 在你的情况下。

如果您只想加载 View ,可以在单独的 xib 中创建 View 文件,但是当我们处理 Storyboard时,我们只添加 UIViewController在它们内部(当然,可以包含自定义 View )。

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

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

关于ios - loadNibNamed 从 Storyboard ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22984933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com