一、解決問題
xib/storybarod可以方便、視覺化的設定約束,在開發中也越來越重要。由於xib不能元件化,使得封裝、重用都變得不可行。本文將介紹一種解決方案,來實現xib元件化。
二、模型塊原理
在介紹原理之前,我們先弄清楚兩個概念:
從上圖可以看出,分別選中file's owner及根檢視view,都有custom class屬性面板。其中class屬性,有什麼作用,區別又是什麼呢?
2.1 view的class屬性
view的class屬性用於指定選中的檢視的例項化類。xib實際上是乙個xml檔案,在載入時,解析邏輯會根據xml內容,建立並設定view例項。而此處的class就是告訴解析邏輯,想要建立什麼類的例項。如果此處設定為uibutton,則解析邏輯會生成乙個uibutton的例項。
2.2 file's owner的class屬性
feile's owner的class屬性,大部分情況下,都為**uiviewcontroller**及其子類。
1public func loadnibnamed(name: string!, owner: anyobject!, options: [nsobject : anyobject]!) -> [anyobject]!
從上面xib的載入介面可以看出,載入xib需要指定乙個owner類的**例項**,解析邏輯並沒有像**2.1**建立新例項,而是使用引數名為owner的已建立好的例項。
如果沒有建立,為什麼還要指定file's owner的class屬性?
此處設定的class屬性值,主要作用是通過關鍵字@iboutlet,宣告有哪些屬性及方法可以建立關聯關係。解析邏輯會將關聯檢視的引用賦值給owner的對應屬性,觸發事件則執行owner.method()方法。目的為了在owner中,就可以方便的處理介面相關的業務邏輯。可以這樣理解,file's owner的class,是關聯介面宣告,loadnibnamed傳入的owner是實現。
tips
file's owner的class屬性,起乙個宣告作用,告知哪些屬性及方法可以使用。12
3456
78class ilviewcontroller: uiviewcontroller
class ilflagcontroller: uiviewcontroller
既然如此(如上面**),使用loadnibnamed方法載入xib時,owner引數傳入ilviewcontroller例項,而xib中file's owner的class卻設定為ilflagcontroller,是否可行?答案:可行。
2.4 xib模組化原理
在storybarod/xib中,與元件化有關的只有檢視的class屬性。檢視是由xib解析邏輯建立,所以要實現元件化,就要在此class例項化時,自動執行載入子xib模組的功能。
三、工具類原始碼
為了實現xib的模組化,需要有乙個小的功能類:12
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
3334
3536
3738
3940
4142
4344
4546
4748
4950
51import uikit
@objc class ilxibview: uiview
required init?(coder adecoder: nscoder)
override func awakefromnib()
private func getxibname() -> string
return
xibname
}
func loadview()
self.contentview = self.loadviewwithnibname(self.getxibname(), owner: self)
self.contentview.frame = self.bounds
self.contentview.backgroundcolor = uicolor.clearcolor()
self.addsubview(self.contentview)
}
private func loadviewwithnibname(filename: string, owner: anyobject) -> uiview
}
四、實戰示例
4.1 封裝xib元件
新建ildemoview.xib、ildemoview.swift兩個檔案(檔名要相同),並將ildemoview檔案的file's owner的class設定為ildemoview12
3456
789class ildemoview: ilxibview
}
在xib檔案中新增uilabel,並關聯到ildemoview中
4.2 使用xib元件
新建xib/storyboard檔案,新增乙個uiview控制項,並將此控制項的class屬性設定為ildemoview
使用的時候,先設定目標uiview的class屬性為ildemoview,再將此uiview控制項拖拽建立關聯關係,會發現此時**中屬性型別已自動設定為ildemoview。ilxibview簡單卻非常實用,我們專案中已經大量的使用它,對於xib的模組化封裝,絕對是一利器。
模組化設計
儘管寫過很多模組,但一直對於模組化設計,沒有一直很清晰的認識,這次學習了軟體設計之道,終於從概念上對模組化設計有了乙個更清晰的認識。乙個軟體本質上是完成乙個或多個特定的功能,所以,寫程式的第一目標是實現需求。既然是實現需求,那是不是隨便怎麼寫,只要完成功能就行呢?不是的,因為,軟體是生命週期的,在乙...
Flex之模組化
難道flex就不能開發大型應用了?還好flex提供了module的支援 我做openlaszlo的時候可沒有這麼幸運,只能自己開發module支援,不過現在已經徹底放棄openlaszlo 還是很簡單的,困難的是如何分割模組。xml 重點是如何呼叫module。有兩種方式可以呼叫module,一種是...
PHP 進行模組化設計
php include 函式與c中同名的預處理命令是不同的,它是乙個給出檔名 如 include test.php php就把檔案調用於include的位置,並方試 釋該檔案,它與函式的差別在於,只有執行include語句時,才 被解析,因此在設計中通常在if語句中包含呼叫來得用這一優點 而requ...