最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

UITableView中Cell重用機制導致內容重復的解決方法

 更新時間:2017年06月28日 09:47:30   作者:ios4  
這篇文章主要為大家詳細介紹了UITableView中Cell重用機制導致內容重復的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

UITableView繼承自UIScrollview,是蘋果為我們封裝好的一個基于scroll的控件。上面主要是一個個的UITableViewCell,可以讓UITableViewCell響應一些點擊事件,也可以在UITableViewCell中加入UITextField或者UITextView等子視圖,使得可以在cell上進行文字編輯。

UITableView中的cell可以有很多,一般會通過重用cell來達到節(jié)省內存的目的:通過為每個cell指定一個重用標識符(reuseIdentifier),即指定了單元格的種類,當cell滾出屏幕時,會將滾出屏幕的單元格放入重用的queue中,當某個未在屏幕上的單元格要顯示的時候,就從這個queue中取出單元格進行重用。

但對于多變的自定義cell,有時這種重用機制會出錯。比如,當一個cell含有一個UITextField的子類并被放在重用queue中以待重用,這時如果一個未包含任何子視圖的cell要顯示在屏幕上,就會取出并使用這個重用的cell顯示在無任何子視圖的cell中,這時候就會出錯。

解決方法:

方法1 將獲得cell的方法從- (UITableViewCell*)dequeueReusableCellWithIdentifier:(NSString*)identifier 換為-(UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath

重用機制調用的就是dequeueReusableCellWithIdentifier這個方法,方法的意思就是“出列可重用的cell”,因而只要將它換為cellForRowAtIndexPath(只從要更新的cell的那一行取出cell),就可以不使用重用機制,因而問題就可以得到解決,雖然可能會浪費一些空間。

示例代碼:

[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  //改為以下的方法
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
  //根據indexPath準確地取出一行,而不是從cell重用隊列中取出
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
   //...其他代碼               
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
  //改為以下的方法
  UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
  //根據indexPath準確地取出一行,而不是從cell重用隊列中取出
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
   //...其他代碼               
}

方法2 通過為每個cell指定不同的重用標識符(reuseIdentifier)來解決。
重用機制是根據相同的標識符來重用cell的,標識符不同的cell不能彼此重用。于是我們將每個cell的標識符都設置為不同,就可以避免不同cell重用的問題了。

示例代碼:

[plain]
- (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];
  }
  //...其他代碼
}

方法3 刪除重用cell的所有子視圖

這個方法是通過刪除重用的cell的所有子視圖,從而得到一個沒有特殊格式的cell,供其他cell重用。

示例代碼:

[plain]
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
  static NSString *CellIdentifier = @"Cell";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; //出列可重用的cell
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
  else
  {
    //刪除cell的所有子視圖
    while ([cell.contentView.subviews lastObject] != nil)
    {
      [(UIView*)[cell.contentView.subviews lastObject] removeFromSuperview];
    }
  }
  //...其他代碼
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Swift 開發(fā)之懶加載的實例詳解

    Swift 開發(fā)之懶加載的實例詳解

    這篇文章主要介紹了Swift 開發(fā)之懶加載的實例詳解的相關資料,希望通過本文能幫助到大家,實現這樣的功能,需要的朋友可以參考下
    2017-09-09
  • iOS實現全局懸浮按鈕

    iOS實現全局懸浮按鈕

    這篇文章主要為大家詳細介紹了iOS實現全局懸浮按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • iOS開發(fā)生成二維碼圖片(附中間帶有小圖標二維碼)

    iOS開發(fā)生成二維碼圖片(附中間帶有小圖標二維碼)

    這篇文章主要介紹了iOS開發(fā)生成二維碼圖片(附中間帶有小圖標二維碼)的方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-10-10
  • iOS實現拼圖小游戲

    iOS實現拼圖小游戲

    這篇文章主要為大家詳細介紹了iOS實現拼圖小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • iOS利用UIScrollView實現圖片的縮放實例代碼

    iOS利用UIScrollView實現圖片的縮放實例代碼

    本篇文章主要介紹了iOS利用UIScrollView實現圖片的縮放實例代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • iOS中延時執(zhí)行的幾種方式比較及匯總

    iOS中延時執(zhí)行的幾種方式比較及匯總

    這篇文章主要給大家介紹了關于iOS中延時執(zhí)行的幾種方式比較及匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-02-02
  • iOS開發(fā)之XLForm的使用方法

    iOS開發(fā)之XLForm的使用方法

    這篇文章主要介紹了iOS開發(fā)之XLForm的使用方法,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • iOS開發(fā)UI篇—xib的簡單使用實例

    iOS開發(fā)UI篇—xib的簡單使用實例

    本篇文章主要介紹了iOS開發(fā)UI篇—xib的簡單使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • Objective-C?入門篇(推薦)

    Objective-C?入門篇(推薦)

    由C語言和Smalltalk擴展出來的,是C語言的超集,最大的區(qū)別是OC是面向對象的,其火星文寫法對于之前從事Java開發(fā)的同學頗感蛋疼,OC最大特點之一是使用消息結構而不是函數調用
    2021-11-11
  • iOS Xcode創(chuàng)建文件時自動生成的注釋方法

    iOS Xcode創(chuàng)建文件時自動生成的注釋方法

    下面小編就為大家分享一篇iOS Xcode創(chuàng)建文件時自動生成的注釋方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01

最新評論

海晏县| 普定县| 株洲市| 云和县| 安阳市| 襄垣县| 独山县| 抚州市| 泾源县| 色达县| 道真| 碌曲县| 渭源县| 余干县| 顺平县| 西充县| 甘肃省| 嘉定区| 凤山县| 东港市| 灌云县| 孙吴县| 蕉岭县| 伊通| 赞皇县| 张家港市| 米脂县| 陵水| 十堰市| 美姑县| 宜州市| 平江县| 三台县| 霞浦县| 西和县| 吉首市| 新宁县| 苗栗县| 信阳市| 晋城| 浦城县|