Swift之xib模組化設計

2022-06-06 18:51:09 字數 3846 閱讀 1568

一、解決問題

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

returnxibname

}

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...