Warning:以下内容可能引起部分人群不适(部分人群:纯代码Coder),请在监护人陪同下观看。
Xib的可视化编程,带给诸如笔者这样打字慢,脑袋转速慢,代码看太多会头晕的人一个开发iOS的机会。
相比在大脑的思维殿堂搭建立体图形,在电脑上用肉眼可见的形式拖拽和堆叠的功能无疑会得到更多开发人员青睐。
以上是废话部分。
Xib加载,大致会有两种情形,代码调用和拖线调用。
我们在工程里面创建了一对文件叫SecView
,这个文件有很多子控件,布局也很复杂,所以我们选择创一个同名的Xib来可视化编程。
创建完成的文件是这样的:
拥有复杂控件的xib里面是这样的:
当然,Xib里面具体有什么和我们今天要说的内容并没有关系。
我们要说的是,
如何让这个Xib正确加载到我们要加载的地方。
现在我们要把这个Xib放在ViewController里面,并让之正常显示。
方法一(代码调用):
1.导入类
#import "SecView.h"
2.创建一个属性
@property (nonatomic, weak) SecView *secView;
3.实例化这个属性,我这里使用的是懒加载的方式,当然也可以直接在ViewDidLoad或者init里面进行初始化。
- (SecView *)secView {
if (!_secView) {
SecView *secView = [SecView secView];
[self.view addSubview:secView];
_secView = secView;
}
return _secView;
}
4.设置Frame,如果你的ViewController也是Xib或者StoryBoard这样可视化控件初始化的,那建议把SecView的Frame设置放在- (void)viewDidLayoutSubviews;
方法中。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.secView.frame = CGRectMake(0, 30, 100, 100);
}
Ps
在第3步中我使用了自定义的类方法[SecView secView]
来初始化View,这个方法的实现部分是这样的。
+ (instancetype)secView {
NSString *className = NSStringFromClass([self class]);
UINib *nib = [UINib nibWithNibName:className bundle:nil];
return [nib instantiateWithOwner:nil options:nil].firstObject;
}
类似这样的方法其实是通用的,抽到一个基类是不错的选择~
方法二(拖线调用):
我们在一个Xib中画了一个View,这个View是另一个Xib实现的,所以使用了绑定,效果如下。
现在这个SecView也是用Xib实现的,为了正确显示,可以尝试一下步骤。
1.导入包,拖线创建属性(步骤略)
2.在SecView的Xib里面拖线,并绑定View的File`s Owner。
要注意这里绑定的是Files Owner 而不是View。
3.在文件中创建一个View的属性。
其实就是对view拖线。
4.重写- (instancetype)initWithCoder:(NSCoder *)aDecoder;
方法代码细节长下面这个样子。
(xib初始化View必调方法)
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super initWithCoder:aDecoder]) {
[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:self options:nil];
[self addSubview:self.view];
}
return self;
}
5.重写- (void)layoutSubviews;
方法,设置属性view的frame。
- (void)layoutSubviews {
[super layoutSubviews];
self.view.frame = self.bounds;
}
Ps:
2-5步都是对SecView的操作。而在装载他的ViewController中只需要拖线拖出一个属性,然后就可以对这个属性肆意揉弄了。
以上是两种Xib加载方式。是很简单,也是很基础的实现方式。
如果对这个两种方法有不同看法,欢迎在下方留言评论。
如果有更好的实现方案,也希望能写在下面~