微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。
[cpp]
view plain
copy
?- (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
return cell;
} - (uitableviewcell *)tableview:(uitableview *)tableview cellforrowatindexpath:(nsindexpath *)indexpath
return cell;}
複製**
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的時候,如果不是空就刪除所有的子檢視。
[cpp]
view plain
copy
?if (cell != nil)
if (cell != nil)
複製**
解決方法三:通過為每個cell指定不同的重用識別符號(reuseidentifier)來解決。
重用機制是根據相同的識別符號來重用cell的,識別符號不同的cell不能彼此重用。於是我們將每個cell的識別符號都設定為不同,就可以避免cell重用問題了。
[cpp]
view plain
copy
?- (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了。
if (cell == nil)
// else
//
// }
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重用問題
在實現uitableview的過程中使用到了cell,在cell上新增一些控制項,但是由於每個cell的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。tableview的重用機制,為了做到顯示和資料分離,ios tableview的實...
iOS UITableViewCell重用問題
在寫微博介面的過程中使用到了cell,那麼就是在cell上新增一些控制項,但是由於每條微博的內容都是不同的,所以在顯示的過程中,出現了內容重疊的問題,其實就是uitableviewcell重用機制的問題。uitableviewcell tableview uitableview tableview ...