欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

UITableView中Cell重用機制導(dǎo)致內(nèi)容重復(fù)的解決方法

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

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

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

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

解決方法:

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

重用機制調(diào)用的就是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]; 
  //根據(jù)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]; 
  //根據(jù)indexPath準確地取出一行,而不是從cell重用隊列中取出
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
  }
   //...其他代碼               
}

方法2 通過為每個cell指定不同的重用標識符(reuseIdentifier)來解決。
重用機制是根據(jù)相同的標識符來重用cell的,標識符不同的cell不能彼此重用。于是我們將每個cell的標識符都設(shè)置為不同,就可以避免不同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];
    }
  }
  //...其他代碼
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • iOS如何獲取設(shè)備型號的最新方法總結(jié)

    iOS如何獲取設(shè)備型號的最新方法總結(jié)

    在開發(fā)中,我們經(jīng)常需要獲取設(shè)備的型號以進行數(shù)據(jù)統(tǒng)計或者做不同的適配。這篇文章主要給大家介紹了關(guān)于iOS如何獲取設(shè)備型號的最新方法,需要的朋友可以參考下
    2018-11-11
  • iOS 獲取當前的ViewController的方法

    iOS 獲取當前的ViewController的方法

    本篇文章主要介紹了iOS 獲取當前的ViewController的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • IOS 創(chuàng)建并發(fā)線程的實例詳解

    IOS 創(chuàng)建并發(fā)線程的實例詳解

    這篇文章主要介紹了IOS 創(chuàng)建并發(fā)線程的實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • iOS內(nèi)存錯誤EXC_BAD_ACCESS的解決方法

    iOS內(nèi)存錯誤EXC_BAD_ACCESS的解決方法

    iOS開發(fā),最郁悶的莫過于程序毫無征兆地就崩潰了,用bt命令打出調(diào)用棧,給出的是一堆系統(tǒng)EXC_BAD_ACCESS的信息,根本沒辦法定位問題出現(xiàn)在哪里
    2013-06-06
  • Objective-C學(xué)習(xí)之ARC的實現(xiàn)方法

    Objective-C學(xué)習(xí)之ARC的實現(xiàn)方法

    自動引用計數(shù)(Automatic Reference Counting, ARC)把壓在程序員們肩頭的管理內(nèi)存的重擔卸除了不少,更不用說讓跟蹤內(nèi)存泄漏那樣的煩心事也少了很多。下面這篇文章主要給大家介紹了關(guān)于Objective-C學(xué)習(xí)之ARC的實現(xiàn)方法,需要的朋友可以參考借鑒下。
    2017-12-12
  • IOS開發(fā)自定義view方法規(guī)范示例

    IOS開發(fā)自定義view方法規(guī)范示例

    這篇文章主要為大家介紹了IOS開發(fā)自定義view方法規(guī)范示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • iOS實現(xiàn)圖片六邊形陰影效果

    iOS實現(xiàn)圖片六邊形陰影效果

    這篇文章給大家分享了如何利用iOS實現(xiàn)圖片六邊形陰影的效果,文中給出實現(xiàn)的示例代碼,對大家的理解和學(xué)習(xí)很有幫助,有需要的可以參考借鑒,下面來一起看看吧。
    2016-09-09
  • iOS開發(fā)教程之WKWebView與JS的交互

    iOS開發(fā)教程之WKWebView與JS的交互

    這篇文章主要給大家介紹了關(guān)于iOS開發(fā)教程之WKWebView與JS的交互的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • iOS自定義PageControl的方法示例

    iOS自定義PageControl的方法示例

    這篇文章主要給大家介紹了關(guān)于iOS自定義PageControl的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-02-02
  • IOS代碼修改音量實例詳解

    IOS代碼修改音量實例詳解

    這篇文章主要介紹了IOS代碼修改音量實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05

最新評論