iOS解決cell重用問題

在寫sina 微博界面的過程當中使用到了cell,那麼就是在cell上添加一些控件,可是因爲每條微博的內容都是不一樣的,因此在顯示的過程當中,出現了內容重疊的問題,其實就是UITableViewCell重用機制的問題。spa

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath .net

code

         static NSString *CellIdentifier = @"Cell"; orm

         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; blog

         if (cell == nil) { rem

          cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; get

         } string

              return cell;it

io

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

       static NSString *CellIdentifier = @"Cell";

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

      if (cell == nil) {

             cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

      }

      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的時候,若是不是空就刪除全部的子視圖。

 

     if (cell != nil) { 

        [cell removeFromSuperview];//處理重用 

     } 

解決方法三: 經過爲每一個cell指定不一樣的重用標識符(reuseIdentifier)來解決。

重用機制是根據相同的標識符來重用cell的,標識符不一樣的cell不能彼此重用。因而咱們將每一個cell的標識符都設置爲不一樣,就能夠避免cell重用問題了。


[cpp] view plaincopyprint?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

       NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來惟一肯定cell 

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell 

      if (cell == nil) { 

           cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 

      } 

//...其餘代碼 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

       NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d%d", [indexPath section], [indexPath row]];//以indexPath來惟一肯定cell

       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell

      if (cell == nil) {

            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

      }

//...其餘代碼

}

複製代碼


原文地址:http://blog.csdn.net/omegayy/article/details/7356823

相關文章
相關標籤/搜索