记 Xib 自定义 View 的一个小坑
最近版本更新,又不想手写代码,所以就借助 xib 了,没想到更新版本以后会出现这个问题.当我将控件拉成属性以后啊,然后呢!就碰到了蛋疼的 bug, 经过一系列的调试以后,终于发现了问题所在!
下面先对 xib 做一个简单的介绍,希望我们大家少踩点儿坑,又或许踩了能够立马知道是什么原因吧!!!
1.File's Owner
重点就是这里了,View和ViewController之间的对应关系,需要一个桥梁来进行连接的(即,对于一个视图,他如何知道自己的界面的操作应该由谁来响应),这个桥梁就是File's Owner。
选中某个XIB的File's Owner,在Inspector中可以看到属性:File Name和Custom Class,该File's Owner就是用来绑定File Name中的xib文件和Custom Class中的ViewController的,在做了这个绑定之后,按住control键,拖动File's Owner到xib中的某个控件的时候,就是Custom Class中定义的IBOutlet元素与xib中元素进行连接的过程,同样,拖动"xib中的控件的动作"到File's Owner的时候,就是将xib中该动作的响应与Custom Class中某个IBAction进行连接的过程。
因此,在存在多个xib文件的情况下,
![Uploading 1_020899.png . . .]
即:有多个View,那么每个View可以采用不同的ViewController,也可以全部采用相同的一个ViewController,通过File's Owner进行关联即可。
其实,File's Owner就是Custom Class类型的对象,而xib中的其他元素都是该对象的成员变量,但是需要手动来关联Custom Class中的成员变量与xib中对象之间的关系。
2. First Responder
View中每次只会有一个对象与用户进行交互,那么当前交互的对象即为First Responder。比如点击文本框,那么此时文本框就是First Responder。
3. View 这个也就是我们的视图了
到这里基本差不多了, 下面简单的说一下如何使用 xib 自定义一个 view 吧.
-
创建一个工程,然后创建一个 view 继承自 UIView,然后创建一个 空的view 的 xib 关联起来,也就是名字和创建的 view 的名字一致就好了
-
打开新建的 xib 文件, 分别将 File's Owner 和 view 的 class 设置为文件名一致
然后我们随意拖一个空间进去随意放一下就好了
写一个遍历构造器方法 (名字大家随意哈)
// 这个地方的 Named 也就是xib 的文件名啦,也可以这样写 NSStringFromClass([self class]) 你开心就好了😝
+(instancetype)initTestView {
return [[[NSBundle mainBundle] loadNibNamed:@"TestView" owner:nil options:nil] lastObject];
}
- 再说一下view 本身的方法
-(instancetype)initWithCoder:(NSCoder *)coder
{
self = [super initWithCoder:coder];
if (self) {
}
return self;
}
众所周知, 这个方法只要创建了 xib 一定会先走这个方法,这里就不多做处理了,关于 xib 的 lable 的字体适配可以通过 runtime 交换这个方法即可,这里就不说了 . 如果我们要对xib 中的一些控件做一些处理的话,那么可以在下面这个方法里面去是实现
-(void)awakeFromNib {
[super awakeFromNib];
}
-
下面重点来了, 将控件拖成属性,找到控件按住 control, 开始拉到对应的.h 文件或者.m文件 (如下图)
注意左下角的小窗口, 如果是控制器的 xib 文件的话,那么这一个基本不用管了,因为默认Object 就是 File's Owner, 至于为什么,请看上文 . 但是如果是自定义的 view, 那么 object 请选择 "Test View" , 这样才能算是关联起来了! 如果是第一个的话, 那么会 crash 掉 :
libc++abi.dylib: terminating with uncaught exception of type NSException
原因就是:
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x600000004e40> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key Btn.' 这样的话如何修改呢? 难道要我删除重新拉线吗,会不会太麻烦了,下面请看图
打开创建的 xib -> 右键控件 -> Referencing Outlets 下面 File's Owner 右边的实心远点拉线至 "Test View" 下面会多一个, File's Owner 删除即可 !