聊聊iOS中UITableView複用的那些事
theme: smartblue
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第1天,點選檢視活動詳情
今天跟大家聊聊在開發中我們所遇到的tableView複用的那些事,相信大家在使用tableView或者collectionView時,都會遇到cell複用導致UI錯亂。在這篇文章中,我總結了一下幾點。
UITableView
中的複用機制,想必大家應該都很清楚了。這裡就先簡單提一下:
在tableview
新建的時候,會新建一個複用池(reuse pool)。這個複用池可能是一個數組,或者是一個連結串列,儲存著當前的cell
。pool中的物件的複用識別符號就是reuseIdentifier
,標識著不同的種類的cell
。呼叫dequeueReusableCellWithIdentifier:
方法獲取cell
。從pool中取出來的cell
都是tableview
展示的原型。無論之前有什麼狀態,全部都要設定一遍。
這裡我們就不對tableview的複用機制過多的探討,只講講平時開發容易忽略的複用的問題。
我列舉了以下幾種情況:
- 在cell中條件判斷沒有覆蓋全場景
- 在cell中使用了延遲或者非同步處理
- 在cell中UIImageView混用了網路圖片和本地圖片
在更新cell的條件判斷沒有覆蓋全場景,只處理了某種條件下UI,其他的沒有處理
if xx {
aLabel.isHidden = true
avatarView.isHidden = false
} else if xx {
aLabel.isHidden = false
avatarView.isHidden = true
} else {
aLabel.isHidden = true
}
在某些時候,cell可能會用來相容很多情況,或者某一個的cell有很多狀態,有時候因為疏忽導致沒有處理全部的情況,常常出現了不該顯示的UI元素顯示出來了。
因為tableview中的cell在使用識別符號之後就會被複用,那麼我們就需要針對複用的cell去做格式化處理。比如每次重新整理時,重製狀態。這樣就可以保證它的狀態是正常的,而不是上一次遺留的。
在cell中的使用了延遲或者非同步處理
if xx {
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
avatarView.image = UIImage.init("123")
}
} else {
xxxx
}
有些時候,在cell中使用了延遲來處理某些邏輯。比如使用GCD或者非同步回撥來更新UI上的顯示,可能會有tableView重新整理時複用問題,所以在使用延遲時,需要格外注意延遲後的邏輯判斷,在重新重新整理時取消延遲處理或非同步操作。
在cell中使用UIImageView載入網路圖片和本地圖片
if xx {
avatarView.image = UIImage.init("123")
} else {
avatarView.kf.setImage(with: url)
}
在cell中我們會經常使用到網路圖片載入庫來載入網路圖片。在某些場景下,我們會將某個UIImageView
既用來載入網路圖片,也用來載入本地圖片。如果有使用場景下我們將一個控制元件用來處理本地、網路兩種情況,那麼需要注意,再給載入本地圖片時取消網路圖片的下載 sd_cancelCurrentImageLoad
,或者不要使用同一個控制元件來載入網路、本地圖片;
原因:載入本地圖片是同步進行的,而載入網路圖片是非同步的,有可能我們在重新整理時,載入本地圖片。但是上次載入的網路圖片還未載入完,這時,如果等上次的網路圖片載入完成後,那麼這個圖片就會造成複用了。
總結下來,容易被忽視的其實還是在cell中有非同步的操作。
- LeetCode 初級演算法之陣列(上),看看你都學會了嗎?
- LeetCode 初級演算法之連結串列,看看你都學會了嗎?
- LeetCode 初級演算法之字串(上),看看你都學會了嗎?
- 純程式碼佈局,也可以一樣的簡潔
- UIStackView之一問一答
- 使用UIStackView來簡化iOS的介面佈局
- 夏天來了,iOS開發者們該如何減少App耗電?(上)
- 夏天來了,App開發者們如何看待手機發燙問題?
- 聊聊iOS中UITableView複用的那些事
- 曾經經典的微信打飛機遊戲還有人記得嗎?
- iOS 原生渲染與 Flutter 有什麼區別 (上)
- 瞭解 Mach-O檔案
- CocoaPods中podsepc檔案設定詳解
- iOS 原生渲染與 Flutter 有什麼區別 (下)
- 簡單瞭解 iOS CVPixelBuffer (上)
- 談談 iOS 包瘦身方案
- 播放器重構的探索之路
- 如何使用CocoaPods製作私有庫
- iOS 元件化方案