swift標配開源庫:Reusable-讓你放肆的dequeueReusableCell

發表於2016-07-23
225849-5bcdce638d7e4038

Reusable

Reusable是一個在swift下使用的開源庫。利用protocol extension結合泛型提供了一個優雅的方案來dequeueReusableCell。

使用

根據型別獲取cell

讓你的cell宣告ReusableNibReusable協議

接著在tableview或者collectionView中register

粗暴的直接獲取cell就可以啦:

是的。你沒有看錯,這樣就能獲取到這個型別的reuse cell,不需要傳入reuseIdentifiers,不需要UITableViewCell型別強轉。

根據型別獲取xib中的UIView物件

UIView物件宣告NibLoadable協議。
利用MyCustomView.loadFromNib()就可以從“MyCustomView.xib”中例項化返回MyCustomView的例項物件

根據型別獲取Storyboards中的UIViewController物件

UIViewController物件宣告StoryboardBased或者StoryboardSceneBased協議。
利用YourCustomViewController.instantiate()就可以從Storyboard中例項化返回例項物件

實現

核心的思路其實很簡單,就是利用自己的類名做為重用識別符號。
我們就來定義一個協議,宣告一個靜態變數reuseIdentifier,並實現extension,預設識別符號返回當前類名:

接著我們給tableview的寫一個自定義獲取reuse cell的擴充套件方法:

注意這個泛型引數,這個泛型是根據返回值的型別來確定的。所以返回的cell必須實現Reusable協議。我們將這型別裡的那個靜態變數T.reuseIdentifier作為Identifier。

我們當然還要同時改造register方法。

這個時候我們忽然意識到,還有registerNib沒有解決。
思路也是相似的,給協議再增加一個返回nib物件的靜態變數唄。就像這樣:

實現是這樣:

但是這裡再往深一點想,其實載入nib和reuseIdentifier是兩件事,因為我們有時也會從xib獲取其他UIView的物件。protocol也提供了組合的特性。所以我們可以把獲取nib單獨拆出來。

這樣最後一塊拼圖就有了:

接著再順手給UIView寫一個根據型別獲取例項的擴充套件方法:

歡迎關注我的微博:@沒故事的卓同學

相關連結:
Using Generics to improve TableView cells

相關文章