兩種加載Xib的實現(xiàn)方法

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)建完成的文件是這樣的:

QQ20160428-0.png

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


QQ20160428-1.png

當然,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)的,所以使用了綁定,效果如下。


QQ20160428-2.png

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

QQ20160428-3.png

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

QQ20160428-4.png

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)方案,也希望能寫在下面~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容