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 加载另一个视图控制器,尝试访问默认视图导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章

你真的了解UIViewController生命周期吗?

如何通过 Interface Builder 的 XIB 传递 NSManagedObjectContext

如何从 .XIB 加载 UIViewController?

单个 UIViewcontroller,如何在多个 xib 之间切换?

使用 pushViewController 时没有 Xib 的 UIViewController 显示空白

UIViewController XIB 的首选惯用语