cellForRowAtIndexPath 的標準用法

在使用TableView的時候,下面一段代碼是必須的,也是最標準的:


[cpp] view plaincopyprint?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {  
      
    static NSString *CMainCell = @"CMainCell";     //  0  
      
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CMainCell];      //   1  
    if (cell == nil) {  
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault  reuseIdentifier: CMainCell] autorelease];    //  2  
    }  
      
    // Config your cell  
        cell.textlabel.text = @"XXX";    //  3  
      
    return cell;  
}  




[cpp] view plaincopyprint?
  
[cpp] view plaincopyprint?
  


可以這樣理解,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),保證不會重複,多組的再加上組號(@"CMainCell%d%d",
indexPath.section,indexPath.row)。那這還有必要用語句2嗎?還是需要的,因爲當自己滾動隱藏,下次再顯示出來的時候,還是可以重用的。標識符完全可以每次用一個新的,但爲了最大限度的重用性,節省資源,纔想了這麼多辦法。


總之,注意添加控件的位置,注意設置控件的位置,注意cell標識符。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章