从xib加载UIViewController的一个坑

问题描述:

项目中创建了一个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];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容