前言
- 在開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到同一個(gè)界面需要在多個(gè)場(chǎng)景中使用,但是每個(gè)場(chǎng)景卻又是針對(duì)原始界面進(jìn)行一些細(xì)微變化的情況,這個(gè)時(shí)候,我們可以采用多個(gè).xib文件復(fù)用同一個(gè)xxxxViewController.swift文件,其實(shí)直接創(chuàng)建多個(gè)控制器文件既具有可讀性也簡(jiǎn)單,這里看著更加的復(fù)雜了,我也不知道為什么會(huì)有這個(gè)操作,但是在原始項(xiàng)目中看到了這個(gè)用法,就把他記錄下來(lái),也算是增加一種新的可能吧;
- 該方法同樣適用于跨target類(lèi)的調(diào)用,但是需要一些細(xì)節(jié)上的注意,后面我會(huì)詳細(xì)說(shuō)明。
構(gòu)筑首個(gè)xxxViewController(帶xib)
1.首先我們像往常一樣創(chuàng)建一個(gè)ViewController;
2.針對(duì)該控制器區(qū)分出通用部分以及單獨(dú)使用部分
這里我標(biāo)注了通用部分和基礎(chǔ)版,這個(gè)通用部分就是后續(xù)多個(gè)xib文件中都需要展示的UI控件,而基礎(chǔ)版則是只會(huì)在該xib文件中使用。

拷貝原始xib文件
1.由于是對(duì)基礎(chǔ)界面進(jìn)行的修改,所以我們直接對(duì)原始界面xib進(jìn)行拷貝;

2.將拷貝后的文件重命名并拖拽進(jìn)項(xiàng)目,這里需要注意的是,如果是跨target調(diào)用的情況,需要在Add to targets中勾選對(duì)應(yīng)的target類(lèi)別,否則調(diào)用時(shí)將報(bào)錯(cuò),推薦命名法直接在后面加上 ".xxxx"來(lái)區(qū)分,這里我使用的是BasicVC.Buyer.xib 與 BasicVC.Seller.xib來(lái)命名

關(guān)聯(lián)拷貝xib的對(duì)應(yīng)控件
1.針對(duì)拷貝后的xib單獨(dú)拖拽對(duì)應(yīng)的控件,通用的文本依舊使用同一個(gè)@IBOutlet 進(jìn)行關(guān)聯(lián),這里使用的是名為lbCommon的UI控件,而單獨(dú)使用的重新拖拽@IBOutlet,由于使用的是weak修飾符,在實(shí)現(xiàn)的過(guò)程中,總是從xib指向代碼塊來(lái)檢索,所以并不用擔(dān)心代碼中遇到xib中不存在的@IBOutlet時(shí)會(huì)報(bào)錯(cuò),但需要注意的是默認(rèn)拖拽生成的UI參數(shù)會(huì)對(duì)該弱引用進(jìn)行強(qiáng)制轉(zhuǎn)換,為了不引起后續(xù)在代碼中操作失誤導(dǎo)致強(qiáng)制轉(zhuǎn)換控制而引起的報(bào)錯(cuò),我們可以將非通用的部分改為可選類(lèi)型?,例如UILabel?
2.對(duì)于跨target調(diào)用的情況,還需要另外在target Membership中勾選出關(guān)聯(lián)的xib所屬的對(duì)應(yīng)target,否則依舊會(huì)報(bào)錯(cuò)

自此所有xib層面所需要完成的工作就結(jié)束了
代碼層面調(diào)用
// 代碼中綁定對(duì)應(yīng)xib的方法
// 由于這里使用的是跨target的情況,所以通過(guò)標(biāo)識(shí)來(lái)進(jìn)行區(qū)分調(diào)用,實(shí)際使用中可自行區(qū)分
func create() -> UIViewController {
var nibName: String?
#if Buyer
nibName = "BasicVC.Buyer"
#elseif Seller
nibName = "BasicVC.Seller"
#else
nibName = "BasicVC"
#endif
// 根據(jù)對(duì)應(yīng)的xib名進(jìn)行加載
let vc = BasicVC(nibName: nibName, bundle: nil)
return vc
}