iOS UITableViewCell重用問題

2021-06-26 12:37:19 字數 2986 閱讀 1169

在實現uitableview的過程中使用到了cell,在cell上新增一些控制項,但是由於每個cell的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。

tableview的重用機制,為了做到顯示和資料分離,ios tableview的實現並且不是為每個資料項建立乙個tablecell。而是只建立螢幕可顯示最大個數的cell,然後重複使用這些cell,對cell做單獨的顯示配置,來達到既不影響顯示效果,又能充分節約內容的目的

解決方法一:

對在cell中新增的控制項設定tag的方法

例如在微博內容中需要新增label,那麼就可以對新增的label設定tag,然後新建cell的時候先remove前乙個cell tag相同的label,再新增新的label,這樣就不會出現cell內容的重疊。

[[cell viewwithtag:100] removefromsuperview];

[[cell contentview] addsubview:contentlabel];

解決方法二:刪除cell中的所有子檢視

在實現微博介面中,乙個cell會有多個控制項(label,imageview...),按理說,對每乙個控制項都設定tag,按照第一種解決方法,應該是可以實現的。但是在實際執行過程中發現不行,還是會出現內容重疊的問題,所以採用第二種解決方法--在新建cell的時候,如果不是空就刪除所有的子檢視。

if (cell != nil) 

if (cell != nil)

解決方法三: 通過為每個cell指定不同的重用識別符號(reuseidentifier)來解決。

重用機制是根據相同的識別符號來重用cell的,識別符號不同的cell不能彼此重用。於是我們將每個cell的識別符號都設定為不同,就可以避免cell重用問題了

- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath 

//...其他**

} - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath

//...其他**

}

這個方法還沒實踐過

重用實現分析

檢視uitableview標頭檔案,會找到nsmutablearray* visiablecells,和nsmutabledictnery* reusabletablecells兩個結構。visiablecells內儲存當前顯示的cells,reusabletablecells儲存可重用的cells。

tableview顯示之初,reusabletablecells為空,那麼tableview dequeuereusablecellwithidentifier:cellidentifier返回nil。開始的cell都是通過[[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault

reuseidentifier:cellidentifier]來建立,而且cellforrowatindexpath只是呼叫最大顯示cell數的次數。

比如:有100條資料,iphone一屏最多顯示10個cell。程式最開始顯示tableview的情況是:

1. 用[[uitableviewcell alloc] initwithstyle:uitableviewcellstyledefault reuseidentifier:cellidentifier]建立10次cell,並給cell指定同樣的重用標識(當然,可以為不同顯示型別的cell指定不同的標識)。並且10個cell全部都加入到visiablecells陣列,reusabletablecells為空。

2. 向下拖動tableview,當cell1完全移出螢幕,並且cell11(它也是alloc出來的,原因同上)完全顯示出來的時候。cell11加入到visiablecells,cell1移出visiablecells,cell1加入到reusabletablecells。

3. 接著向下拖動tableview,因為reusabletablecells中已經有值,所以,當需要顯示新的cell,cellforrowatindexpath再次被呼叫的時候,tableview dequeuereusablecellwithidentifier:cellidentifier,返回cell1。cell1加入到visiablecells,cell1移出reusabletablecells;cell2移出visiablecells,cell2加入到reusabletablecells。之後再需要顯示的cell就可以正常重用了。

所以整個過程並不難理解,但需要注意正是因為這樣的原因:配置cell的時候一定要注意,對取出的重用的cell做重新賦值,不要遺留老資料。

一些情況

使用過程中,我注意到,並不是只有拖動超出螢幕的時候才會更新reusabletablecells表,還有:

1. reloaddata,這種情況比較特殊。一般是部分資料發生變化,需要重新重新整理cell顯示的內容時呼叫。在cellforrowatindexpath呼叫中,所有cell都是重用的。我估計reloaddata呼叫後,把visiablecells中所有cell移入reusabletablecells,visiablecells清空。cellforrowatindexpath呼叫後,再把reuse的cell從reusabletablecells取出來,放入到visiablecells。

2. reloadrowsatindex,重新整理指定的indexpath。如果呼叫時reusabletablecells為空,那麼cellforrowatindexpath呼叫後,是新建立cell,新的cell加入到visiablecells。老的cell移出visiablecells,加入到reusabletablecells。於是,之後的重新整理就有cell做reuse了。

iOS UITableViewCell重用問題

在寫微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 uit...

iOS UITableViewCell重用問題

微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。cpp view plain copy print uitableviewcell tablevie...

iOS UITableViewCell重用問題

在寫微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。uitableviewcell tableview uitableview tableview ...