UIViewController 通过 xib 加载另一个视图控制器,尝试访问默认视图导致崩溃
Posted
技术标签:
【中文标题】UIViewController 通过 xib 加载另一个视图控制器,尝试访问默认视图导致崩溃【英文标题】:UIViewController loading another view controller via xib, trying to access the default view causes crash 【发布时间】:2016-12-05 15:28:40 【问题描述】:所以,我有这个问题,这应该是微不足道的。我有一个视图控制器,它正在从 xib 加载另一个视图控制器。尝试引用该辅助视图控制器的视图时崩溃:
'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "Embedded" nib but the view outlet was not set.'
*** First throw call stack:
(
0 CoreFoundation 0x000000010689134b __exceptionPreprocess + 171
执行此操作的代码 sn-p 如下所示:
- (void)viewDidLoad
[super viewDidLoad];
// loads controller just fine.
EbeddedViewController *embedded = [[EbeddedViewController alloc] initWithNibName:@"Embedded" bundle:nil];
// KABOOM on line below
UIView *embeddedViewIs = embedded.view;
EmbeddedViewController 扩展了 UIViewController,很普通/普通..
#import "EbeddedViewController.h"
@interface EbeddedViewController ()
@property (nonatomic, strong) IBOutlet UILabel *embeddedLabel;
@end
@implementation EbeddedViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
*/
@end
这很无聊很普通:
这是默认视图 - 我尝试为它添加一个 IBOutlet,但它崩溃了。
xib 视图控制器已正确设置自定义类:
我不知道为什么会崩溃。如果您想尝试这个小应用程序,请在此处下载:
Link to a tiny two view controller app where this crash is demonstrated
【问题讨论】:
尝试在 viewDidAppear 方法中访问视图。 viewDidLoad 方法中还没有设置 Outlets。 感谢您的回复!我确实尝试过放置那段关键代码——将 xib 加载到 viewdidappear 中,然后以完全相同的方式发生崩溃——同样的事情。然后我决定将它们拆分——我将 xib 的加载放在 viewdidload 中,并在 viewdidappear 中访问视图,它也以完全相同的方式崩溃... 【参考方案1】:-
如果您想使用 xib 制作控制器的视图,则不应将控制器添加到 InterfaceBuilder,只需添加一个视图即可。
选择文件的所有者并设置自定义类(EmbeddedViewController)
通过控制从文件所有者拖动到图像上的视图,将文件所有者的视图出口连接到新创建的视图
【讨论】:
以上是关于UIViewController 通过 xib 加载另一个视图控制器,尝试访问默认视图导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
通过 addSubview 添加后,在父 UIViewController 中调用方法
通过 segue 问题在 UITableView 和 UIViewController 之间推送数据
通过UITabBarController调用UIViewController进行推送
如何通过将类名传递给方法来创建子类 UIViewController?