Warning:以下內(nèi)容可能引起部分人群不適(部分人群:純代碼Coder),請在監(jiān)護人陪同下觀看。
Xib的可視化編程,帶給諸如筆者這樣打字慢,腦袋轉(zhuǎn)速慢,代碼看太多會頭暈的人一個開發(fā)iOS的機會。
相比在大腦的思維殿堂搭建立體圖形,在電腦上用肉眼可見的形式拖拽和堆疊的功能無疑會得到更多開發(fā)人員青睞。
以上是廢話部分。
Xib加載,大致會有兩種情形,代碼調(diào)用和拖線調(diào)用。
我們在工程里面創(chuàng)建了一對文件叫SecView,這個文件有很多子控件,布局也很復(fù)雜,所以我們選擇創(chuàng)一個同名的Xib來可視化編程。
創(chuàng)建完成的文件是這樣的:

擁有復(fù)雜控件的xib里面是這樣的:

當然,Xib里面具體有什么和我們今天要說的內(nèi)容并沒有關(guān)系。
我們要說的是,
如何讓這個Xib正確加載到我們要加載的地方。
現(xiàn)在我們要把這個Xib放在ViewController里面,并讓之正常顯示。
方法一(代碼調(diào)用):
1.導(dǎo)入類
#import "SecView.h"
2.創(chuàng)建一個屬性
@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.設(shè)置Frame,如果你的ViewController也是Xib或者StoryBoard這樣可視化控件初始化的,那建議把SecView的Frame設(shè)置放在- (void)viewDidLayoutSubviews;方法中。
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
self.secView.frame = CGRectMake(0, 30, 100, 100);
}
Ps
在第3步中我使用了自定義的類方法[SecView secView]來初始化View,這個方法的實現(xiàn)部分是這樣的。
+ (instancetype)secView {
NSString *className = NSStringFromClass([self class]);
UINib *nib = [UINib nibWithNibName:className bundle:nil];
return [nib instantiateWithOwner:nil options:nil].firstObject;
}
類似這樣的方法其實是通用的,抽到一個基類是不錯的選擇~
方法二(拖線調(diào)用):
我們在一個Xib中畫了一個View,這個View是另一個Xib實現(xiàn)的,所以使用了綁定,效果如下。

現(xiàn)在這個SecView也是用Xib實現(xiàn)的,為了正確顯示,可以嘗試一下步驟。
1.導(dǎo)入包,拖線創(chuàng)建屬性(步驟略)
2.在SecView的Xib里面拖線,并綁定View的File`s Owner。

要注意這里綁定的是Files Owner 而不是View。
3.在文件中創(chuàng)建一個View的屬性。
其實就是對view拖線。

4.重寫- (instancetype)initWithCoder:(NSCoder *)aDecoder;方法代碼細節(jié)長下面這個樣子。
(xib初始化View必調(diào)方法)
- (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;方法,設(shè)置屬性view的frame。
- (void)layoutSubviews {
[super layoutSubviews];
self.view.frame = self.bounds;
}
Ps:
2-5步都是對SecView的操作。而在裝載他的ViewController中只需要拖線拖出一個屬性,然后就可以對這個屬性肆意揉弄了。
以上是兩種Xib加載方式。是很簡單,也是很基礎(chǔ)的實現(xiàn)方式。
如果對這個兩種方法有不同看法,歡迎在下方留言評論。
如果有更好的實現(xiàn)方案,也希望能寫在下面~