iOS UITableviewCell的重用機制

2021-07-04 08:45:08 字數 2745 閱讀 1845

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

重用實現分析:

檢視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了。

注意:1-重取出來的cell是有可能已經**過資料或者加過子檢視的,所以,如果有必要,要清除資料(比如textlabel的text)和remove掉add過的子檢視(使用tag)。

2-這樣設計的目的是為了避免頻繁的 alloc和delloc cell物件而已,沒有多複雜。

3-設計的關鍵是實現cell和資料的完全分離

重點:避免重用機制出錯

1.重用機制呼叫的就是dequeuereusablecellwithidentifier這個方法,方法的意思就是「出列可重用的cell」,因而只要將它換為cellforrowatindexpath(只從要更新的cell的那一行取出cell),就可以不使用重用機制,因而問題就可以得到解決,但會浪費一些空間

2.為每個cell指定不同的重用識別符號(reuseidentifier)來解決。重用機制是根據相同的識別符號來重用cell的,識別符號不同的cell不能彼此重用。

[cpp]view plain

copy

print?

nsstring *identifier = [nsstring stringwithformat:@

"timelinecell%d%d"

,indexpath.section,indexpath.row];   3.

刪除重用的cell的所有子檢視,從而得到乙個沒有特殊格式的cell,供其他cell重用。

[cpp]view plain

copy

print?

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重用問題

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

iOS UITableViewCell重用問題

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