前言
- 在開發(fā)過程中颜屠,我們經(jīng)常會遇到同一個界面需要在多個場景中使用,但是每個場景卻又是針對原始界面進行一些細微變化的情況糜工,這個時候筐骇,我們可以采用多個.xib文件復用同一個xxxxViewController.swift文件惠拭,其實直接創(chuàng)建多個控制器文件既具有可讀性也簡單扩劝,這里看著更加的復雜了,我也不知道為什么會有這個操作职辅,但是在原始項目中看到了這個用法棒呛,就把他記錄下來,也算是增加一種新的可能吧域携;
- 該方法同樣適用于跨target類的調(diào)用簇秒,但是需要一些細節(jié)上的注意,后面我會詳細說明秀鞭。
構筑首個xxxViewController(帶xib)
1.首先我們像往常一樣創(chuàng)建一個ViewController趋观;
2.針對該控制器區(qū)分出通用部分以及單獨使用部分
這里我標注了通用部分和基礎版,這個通用部分就是后續(xù)多個xib文件中都需要展示的UI控件锋边,而基礎版則是只會在該xib文件中使用皱坛。
拷貝原始xib文件
1.由于是對基礎界面進行的修改,所以我們直接對原始界面xib進行拷貝豆巨;
2.將拷貝后的文件重命名并拖拽進項目剩辟,這里需要注意的是,如果是跨target調(diào)用的情況往扔,需要在Add to targets中勾選對應的target類別贩猎,否則調(diào)用時將報錯,推薦命名法直接在后面加上 ".xxxx"來區(qū)分萍膛,這里我使用的是BasicVC.Buyer.xib 與 BasicVC.Seller.xib來命名
關聯(lián)拷貝xib的對應控件
1.針對拷貝后的xib單獨拖拽對應的控件吭服,通用的文本依舊使用同一個@IBOutlet 進行關聯(lián),這里使用的是名為lbCommon的UI控件蝗罗,而單獨使用的重新拖拽@IBOutlet噪馏,由于使用的是weak修飾符,在實現(xiàn)的過程中绿饵,總是從xib指向代碼塊來檢索欠肾,所以并不用擔心代碼中遇到xib中不存在的@IBOutlet時會報錯,但需要注意的是默認拖拽生成的UI參數(shù)會對該弱引用進行強制轉(zhuǎn)換拟赊,為了不引起后續(xù)在代碼中操作失誤導致強制轉(zhuǎn)換控制而引起的報錯刺桃,我們可以將非通用的部分改為可選類型?,例如UILabel?
2.對于跨target調(diào)用的情況吸祟,還需要另外在target Membership中勾選出關聯(lián)的xib所屬的對應target瑟慈,否則依舊會報錯
自此所有xib層面所需要完成的工作就結(jié)束了
代碼層面調(diào)用
// 代碼中綁定對應xib的方法
// 由于這里使用的是跨target的情況桃移,所以通過標識來進行區(qū)分調(diào)用,實際使用中可自行區(qū)分
func create() -> UIViewController {
var nibName: String?
#if Buyer
nibName = "BasicVC.Buyer"
#elseif Seller
nibName = "BasicVC.Seller"
#else
nibName = "BasicVC"
#endif
// 根據(jù)對應的xib名進行加載
let vc = BasicVC(nibName: nibName, bundle: nil)
return vc
}