UITableView 關於dequeueReusableCellWithIdentifier的問題

     最近做項目,爲了一個簡單的列表的格式bug ,整個一整天,具體的顯示效果就是一個帶有圓角的列表,但是第一條和最後一條的樣式稍有不同,可是具體操作過程中,發現,當屏幕顯示滿一屏時,下拉拖動scrollview,顯示的效果就完全亂掉,糾結了一個下午。在stackhack 裏面找了很多的資料,其中也遇到一個仁兄和我有類似的問題,網址如下:

http://stackoverflow.com/questions/9231227/uitableview-cell-updates-when-i-scroll

可是挪動了位置,還是有一些瑕疵,最後,看到csdn 上這位仁兄的博客,才恍然大悟,哎,還是要了解原理啊哭


該仁兄的內容如下

  1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
  2.       
  3.     static NSString *CMainCell = @"CMainCell";     //  0  
  4.       
  5.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];      //   1  
  6.     if (cell == nil) {  
  7.         cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier: CMainCell] autorelease];    //  2  
  8.     }  
  9.       
  10.     // Config your cell  
  11.         cell.textlabel.text = @"XXX";    //  3  
  12.       
  13.     return cell;  
  14. }  



可以這樣理解,cell有一個地方(假設稱爲隊列),專門存放那些生成過的,但是後來由於滾動tableView而隱藏起來的cell,而代碼中語句1就是從隊列中根據標示符取出一個暫時不用的cell,只有cell爲nil,也就是隊列中沒有舊的cell的時候,纔會執行語句2,生成一個新的cell。如果有舊的,就不用執行語句2了,這樣節省資源,算作一種重用吧。在tableView初始化的時候隊列中肯定沒有cell的,所以每個cell生成的時候都會執行一遍2,當屏幕顯示滿了,向上滾動顯示下一行時,就會把第一行隱藏,放到那個隊列中,然後新增加的一行執行語句1的時候,結果就不是nil了,然後,就跳過語句2了,這樣就節約資源了。

當然,上面這樣對於使用系統提供的cell格式是沒有什麼問題,但是如果自己在cell上添加一些控件時,比如一個label,有時就會出現問題。尤其是各個cell的label的文字不相同時。首先這個添加的過程一定要在語句2之後,這樣纔是一次添加,如果放在語句3之後,那麼由於cell的重用可能舊的上面已經有label了,你再添加一個,造成多次添加。其次label的文本值必須保證每次都要重新設置,也就是在語句3之後設置,這樣才能保證每次必須執行。如果放在語句2後面,那麼當使用舊的cell時,仍會保留舊的label文字,這是不對的。所以是在2後添加,在3後設置,可以在2添加的時候設一個tag值,這樣可以在3處通過tag值獲取控件設置。

關於語句0,如果每個cell的結構完全相同,那沒問題,就用這一個標識符,但是如果各個cell結構不完全相同,有的有textfield,有的有button,有的有switch,那就不能互相重用了,只能每行用不同的標識符了,可以方便的利用(@"CMainCell%d", indexPath.row),保證不會重複,多組的再加上組號。那這還有必要用語句2嗎?還是需要的,因爲當自己滾動隱藏,下次再顯示出來的時候,還是可以重用的。標識符完全可以每次用一個新的,但爲了最大限度的重用性,節省資源,纔想了這麼多辦法。

總之,注意添加控件的位置,注意設置控件的位置,注意cell標識符。


一席話,突然就把bug 解決了,哈哈,小小的記一下,寶貴的經驗啊大笑

參考博客網址:http://blog.csdn.net/winsdom123456/article/details/7363383


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章