xxxViewController会与xxxView.xib冲突
问题
Xcode 9.1
学习StoryBoard,想自定义一个xib,对一个XXView添加一个xib,取名为XXView.xib
,运行的时候发现,竟然奔溃了…粗略查找了下,发现可能跟我有一个XXViewController
类(没有带xib)有关。于是便做了一下尝试。
过程
有一个AAViewController
控制器(创建时候没有点上),就创建了一个AAView.xib
,画好界面后发现push进入这个控制器就会奔溃,报如下信息:
|
|
渣渣的我自然看不懂,然后就做了尝试:
试验
把AAView.xib -> File’s Owner -> Class设置为AAViewController,运行:
同样报错奔溃。把AAView.xib -> File’s Owner -> Class设置为AAViewController,control按住拖线从 File’s Owner 到 View,运行:
成功push到AAViewController,显示的是AAView.xib。新建一个BBViewController,在新建的时候勾选上Also create XIB file,push到BBViewController,运行:
成功push到BBViewController,显示的是BBViewController.xib。新建一个BBViewController,在新建的时候勾选上Also create XIB file,然后在新建一个BBView.xib,push到BBViewController,运行:
成功push到BBViewController,显示的是BBViewController.xib。
对比1和2,3和4,很明显,xib和viewController差了个连接关系,所以我打开BBView.xib和BBViewController.xib的源文件显示,对比了下:
BBView.xib:
BBViewController.xib:
主要差别就在于第一个
其实就是试验2拖线的操作,就是差一个viewController和xib的连接关系。
所以我猜想,当你创建XXXViewController
的时候如果没有勾选上Also create XIB file,那么系统在加载这个ViewController的时候在有XXXView.xib
的情况下会自动加载这个xib,如果这个xib并没有连接到XXXViewController
时,便会抛出异常,奔溃闪退。
如果勾选上了,加载的便是系统创建的XXXViewController.xib
,无论是否有XXXView.xib
都不影响正常运行。
解决
所以要我们在有XXXViewController
没自带XXXViewController.xib
的时候,不能为其他View或者ViewController创建连接XXXView命名的xib,因为这已经被XXXViewController
占有了,必须用其他命名或者给XXXViewController
指定连接另一个xib。
原文作者: JackNehc
原文链接: https://jacknehc.github.io/2017/11/17/xxxViewController会与xxxView-xib冲突/
许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议