一行程式碼建立cell

uxiu發表於2018-08-20

GitHub程式碼

一、上程式碼

一行程式碼建立cell

let cell = InventoryCell.setup(in: tableView, at: indexPath)
或者
let cell = InventoryCell.newAlways()
或者
let cell = InventoryCell.setup(in: tableView, at: indexPath, reuseAtTheIndexPathOnly: true)
複製程式碼

返回值都是 InventoryCell這樣做的好處是不用註冊cell,不需要管理***重用識別符號***,不需要轉換cell的型別


二、還是程式碼

一行程式碼建立cell

public static func newAlways(_ cellStyle: UITableViewCellStyle = default) -> Self

public static func setup(in tableView: UITableView, cellStyle: UITableViewCellStyle = default) -> Self

public static func setup(in tableView: UITableView, at indexPath: IndexPath, reuseAtTheIndexPathOnly reusable: Bool = default) -> Self
複製程式碼

1.上面這三個是核心方法,newAways()見名知意,總是建立新的cell。大家都知道在cell的代理方法中,滑動列表的時候程式碼會重複呼叫,如果建立的cell不想重用,可以呼叫此方法來建立。可以在任何方法中呼叫來建立cell,如:

一行程式碼建立cell


2.setup(in tableView: UITableView, cellStyle: UITableViewCellStyle = default)這個方法與第一個剛好不同,等同於如下程式碼

一行程式碼建立cell

建立的cell在滑動列表的時候會根據重用識別符號進行重用,如果列表內容較多,且資料格式一致,牆裂建議使用此方法,節省系統資源


3.setup(in tableView: UITableView, at indexPath: IndexPath, reuseAtTheIndexPathOnly reusable: Bool = default) 這個方法的引數 reuseAtTheIndexPathOnlyfalse時,效果等同於2方法,都會對cell重用,之所以保留是因為這兩個方法建立cell的方式不同。3方法是通過註冊建立的。

這個方法主要用在代理方法中建立在指定indexPath進行重用的cell,建立的cell也會重用,是在指定的indexPath進行重用,比如上傳表單內容的列表,每個cell的內容都不同,在對應的indexPath重用,不會造成資料錯亂。(這個例子舉的不太好,表單中建立cell我一般會用1方法,初始化時建立一個cell陣列,在代理方法中返回對應indexPath[section][row]的cell)


三、繼續上程式碼

一行程式碼建立cell
這是方法內部的實現,是通過協議來實現,對程式碼入侵比較小,匯入工程就能使用這些方法 下面是方法內變數、方法的來源:

一行程式碼建立cell

自此,方法使用介紹完畢,內部實現相信大家也瞭然於心


然鵝,就這樣結束了?

四、依然上程式碼

一行程式碼建立cell

可以滑動的列表上元素那麼多,只有 “一行程式碼建立cell” 怎麼夠?現在還可以: 一行程式碼建立 TableViewHeadterFooterView一行程式碼建立 collectionViewCell一行程式碼建立 collectionHeaderFooterView(UICollectionReusableView)


五、小結


1、先說說程式碼中還存在的問題

collectionViewCell繼承自UICollectionReuseableView,就是collectionView的區頭區尾檢視,這樣造成在呼叫setup方法建立collectionViewCell的時候,編譯器程式碼提示會把建立區頭的方法也顯示成建立collectionViewCell的方法:

一行程式碼建立cell
這個小問題目前還沒有解決,本來考慮通過不同的協議來區分,後來發現行不通,繼承自UICollectionReusableView的類都會有父類的方法,如果用子類的話還可以通過關鍵字final使子類不能繼承此方法,但這裡是用協議實現的,不能使用這個關鍵字,不知有沒有我沒了解到的知識能解決這個問題,歡迎大家一起交流

② 視覺化程式設計,建立的xib檔案,如果想要重用的話需要注意填寫 重用識別符號 ,否則無法重用,只能每次都建立新的view

③ 由於colleactionViewCell只能通過註冊來建立,所以沒能寫出tableViewCell那種隨處可使用的newAlways()方法。

collectionViewCellnewAlways()方法是通過每次註冊隨機的reuseIdentifier來實現的,這樣子滑動列表會一直建立新的cell,而沒有複用,如果需要建立非常多的cell,對系統資源的佔用比較多。 初步構想通過自動釋放池對建立的cell進行管理,對不在螢幕顯示區域的cell手動釋放記憶體,因為本人目前對Swift的自動釋放池不太熟,目前輪子裡沒有加入相關的程式碼

目前自己發現的問題有這些,歡迎一起探討


2、說說程式碼中的一些小思考

① 四種可重用的cell,本來只想寫一個帶有 reuseAtTheIndexPathOnly的方法,把程式碼再精簡一下,最後發現放在一個方法中判斷四種型別有點亂,反而沒有分開邏輯清晰

② 在這次造輪子的過程中得到了一些人的幫助,發現自己的進步比在寫邏輯程式碼的舒適區提高的快,興趣依然是程式設計師進步的有效方式

③ 這個輪子也只是利用了編譯器的提供的一些便利,深度上並沒有擴充套件。有很多程式設計師寫底層程式碼,開發新的技術,也有人(xcode開發團隊)開發方便大家使用的工具,在應用層帶來便利,就如這個輪子在使用上帶來的一點點便利。


相關文章