2011-06-11 35 views
11


蘋果的iOS TableView和細胞重複使用正在殺死我。我搜索,搜索和研究,但找不到好的文檔或很好的答案。問題是當TableView重複使用單元格時,在選定單元格上設置的複選標記(單元附件)在表格視圖中的下一個單元格中重複。據我所知,由於內存限制,單元重用是設計的,但是如果你有一個包含50個項目的列表,並且它開始在不需要的地方設置額外的複選標記,這使得整個嘗試都無用。TableView細胞重複使用和不需要的複選標記 - 這是我的死亡

我想要做的就是在我選擇的單元格上設置複選標記。我已經嘗試過使用我自己的自定義單元類和由鍋爐板TableView類生成的標準單元,但它總是以相同的方式結束。

蘋果甚至有一個名爲TouchCell的示例項目,您可以從開發中心下載,這應該顯示一種使用左側圖像控件的自定義單元格設置複選標記的不同方式。該項目使用一個數據源的字典對象而不是一個可變數組,因此每個項目都有一個字符串值和布爾檢查值。該布爾檢查值應該設置複選標記,以便它可以跟蹤選定的項目。此示例項目還會在您使用15個單元格填充TableView時立即顯示此愚蠢行爲。單元的重用開始設置不需要的複選標記。

我甚至嘗試過對每個單元格使用一個真正唯一的單元標識符進行試驗。因此,不是每個單元格都具有類似於@「Acell」的單元格,而是使用了一個靜態整型,將其轉換爲一個字符串,以便單元格獲得@「cell1」,@「cell2」等。在測試期間,我可以看到數百個新單元格在滾動期間生成,即使表只有30個項目。

它確實解決了複選標記重複問題,但我懷疑內存使用量過高。

就好像當前不在表格的可視區域中的單元格在滾動到視圖中時一樣重新創建。

有沒有人想出了這種刺激性行爲的優雅解決方案?

回答

17

電池的再利用可能會非常棘手,但你必須保持兩件事情記:

  • 使用一個標識符一個類型的細胞 - 使用多個標識符時,使用不同的UITableViewCell真的只需要 - 在一個表視圖中的子類,你必須依賴於他們對不同單元格的不同行爲
  • 您可以重用的單元格可以在任何狀態,這意味着您必須再次配置單元格的每個方面 - 尤其是checkmars/image S /文本/ accessoryViews/accessoryTypes多

你需要做的是爲您的對號態的存儲 - (包含布爾值的NSNumber對象分別的NSArray或)含有的bool一個簡單的數組應該這樣做。然後,當你需要創建/重用電池中使用以下邏輯:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *reuseIdentifier = @"MyCellType"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; 
    if(cell == nil) { 
     /* create cell here */ 
    } 
    // Configure cell now 
    cell.textLabel.text = @"Cell text"; // load from datasource 
    if([[stateArray objectAtIndex:indexPath.row] boolValue]) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    return cell; 
} 

,那麼你將不得不在水龍頭反應:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [stateArray replaceObjectAtIndex:indexPath.row withObject:[NSNumber numberWithBool:![[stateArray objectAtIndex:indexPath.row] boolValue]]]; 
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 

只要記住使用NSMutableArray進行數據存儲;)

+0

馬丁,看看這個: – nick 2011-06-11 14:43:31

+0

感謝Martin的建議。我會試一試,儘管它看起來像DevCenter(蘋果代碼)的TouchCell項目中的代碼的變體。他們使用Dictionary類來存儲BOOL值和單元格文本。它只用幾個單元格(9或10)就可以正常工作,但當單元格被重複使用20到30或更多時,以相同的方式擰緊...順便說一句,我試着在今天早些時候通過儀器運行測試應用程序,我根本不重複使用單元,它實際上使用的內存比首選方法少。 (如果我正確理解儀器!)。 – nick 2011-06-11 14:54:26

+0

我沒有看到他們的代碼,但他們很可能看起來很相似,因爲這是你想要去的方式。也許你應該在某處上傳你的代碼並在這裏發佈鏈接作爲評論 – 2011-06-11 15:04:39