问题描述:
项目中创建了一个XBLoginViewController
,并勾选了Also Create XIB file
,于是项目中生成了XBLoginViewController.h
,XBLoginViewController.m
和XBLoginViewController.xib
三个文件.
需要push或者modal这个xib时,使用[[XBLoginViewController alloc]init]
创建,并且使用[[XBLoginViewController alloc] initWithNibName:nil bundle:nil]
也是可行的.
但是!
但是!
但是!
当根据需求再在项目中创建一个继承UIView的XBLoginView时,使用上面的方法使用XBLoginViewController
就会造成应用崩溃:
reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “XBLoginView” nib but the view outlet was not set.’
而且,模拟器运行正常,只有真机报错崩溃.
字面含义是UIViewController在加载xib的过程中没有找到一个和XBLoginView
连接的属性,无论你在XBLoginViewController
中有没有使用到这个XBLoginView
.
错误原因
创建UIViewController
如果勾选了Also Create XIB file
,再创建相应的控制器时,系统会自动在mainBundle
中寻找同名的xib文件,所以不指定xib文件名也是可行的.但是如果项目中同时存在一个同名的View,那么系统会优先匹配这个View作为UIViewController
的view,显然,这会导致crash.
解决方案
创建时指定xib名:[[XBLoginViewController alloc]initWithNibName:@"XBLoginViewController" bundle:nil];