一、上程式碼
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的型別
二、還是程式碼
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,如:
2.setup(in tableView: UITableView, cellStyle: UITableViewCellStyle = default)
這個方法與第一個剛好不同,等同於如下程式碼
建立的cell在滑動列表的時候會根據重用識別符號進行重用,如果列表內容較多,且資料格式一致,牆裂建議使用此方法,節省系統資源
3.setup(in tableView: UITableView, at indexPath: IndexPath, reuseAtTheIndexPathOnly reusable: Bool = default)
這個方法的引數 reuseAtTheIndexPathOnly 為false
時,效果等同於2方法,都會對cell重用,之所以保留是因為這兩個方法建立cell的方式不同。3方法是通過註冊建立的。
這個方法主要用在代理方法中建立在指定indexPath進行重用
的cell,建立的cell也會重用,是在指定的indexPath進行重用,比如上傳表單內容的列表,每個cell的內容都不同,在對應的indexPath重用,不會造成資料錯亂。(這個例子舉的不太好,表單中建立cell我一般會用1方法,初始化時建立一個cell陣列,在代理方法中返回對應indexPath[section][row]的cell)
三、繼續上程式碼
這是方法內部的實現,是通過協議來實現,對程式碼入侵比較小,匯入工程就能使用這些方法 下面是方法內變數、方法的來源:自此,方法使用介紹完畢,內部實現相信大家也瞭然於心
然鵝,就這樣結束了?
四、依然上程式碼
可以滑動的列表上元素那麼多,只有 “一行程式碼建立cell” 怎麼夠?現在還可以: 一行程式碼建立 TableViewHeadterFooterView, 一行程式碼建立 collectionViewCell, 一行程式碼建立 collectionHeaderFooterView(UICollectionReusableView)
五、小結
1、先說說程式碼中還存在的問題
① collectionViewCell
繼承自UICollectionReuseableView
,就是collectionView的區頭區尾檢視,這樣造成在呼叫setup方法建立collectionViewCell的時候,編譯器程式碼提示會把建立區頭的方法也顯示成建立collectionViewCell的方法:
UICollectionReusableView
的類都會有父類的方法,如果用子類的話還可以通過關鍵字final
使子類不能繼承此方法,但這裡是用協議實現的,不能使用這個關鍵字,不知有沒有我沒了解到的知識能解決這個問題,歡迎大家一起交流
② 視覺化程式設計,建立的xib檔案,如果想要重用的話需要注意填寫 重用識別符號 ,否則無法重用,只能每次都建立新的view
③ 由於colleactionViewCell
只能通過註冊來建立,所以沒能寫出tableViewCell
那種隨處可使用的newAlways()
方法。
④ collectionViewCell
的newAlways()
方法是通過每次註冊隨機的reuseIdentifier
來實現的,這樣子滑動列表會一直建立新的cell,而沒有複用,如果需要建立非常多的cell,對系統資源的佔用比較多。
初步構想通過自動釋放池對建立的cell進行管理,對不在螢幕顯示區域的cell手動釋放記憶體,因為本人目前對Swift的自動釋放池不太熟,目前輪子裡沒有加入相關的程式碼
目前自己發現的問題有這些,歡迎一起探討
2、說說程式碼中的一些小思考
① 四種可重用的cell,本來只想寫一個帶有 reuseAtTheIndexPathOnly的方法,把程式碼再精簡一下,最後發現放在一個方法中判斷四種型別有點亂,反而沒有分開邏輯清晰
② 在這次造輪子的過程中得到了一些人的幫助,發現自己的進步比在寫邏輯程式碼的舒適區提高的快,興趣依然是程式設計師進步的有效方式
③ 這個輪子也只是利用了編譯器的提供的一些便利,深度上並沒有擴充套件。有很多程式設計師寫底層程式碼,開發新的技術,也有人(xcode開發團隊)開發方便大家使用的工具,在應用層帶來便利,就如這個輪子在使用上帶來的一點點便利。