2013-04-14 48 views
1

每當我創建一個新單元格時,都會發生奇怪的魔法。如果我稍後退出視圖控制器(數據全部保存),並再次返回視圖控制器(重新載入數據等),一切都可以(但是如果我留在視圖控制器中,它會搞砸了)UITableViewCell willDisplayCell方法難題

現在讓我來描述這個奇怪的魔法:

  • 我有一個自定義的UITableViewCell
  • 當indexPath甚至,一個藍色圓圈存在於它
  • 當indexPath是奇數,綠色矩形存在

但是,當創建一個新的單元格時,它同時具有一個綠色矩形和一個藍色圓圈,這是如何實現的?

- (void)tableView:(UITableView *)tableView willDisplayCell:(CustomCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (cell.blueCircle) cell.blueCircle = nil; 
    if (cell.greenRect) cell.greenRect = nil;  
    if (indexPath.row % 2 == 0){ 
     NSLog(@"Even indexPath: %@", indexPath); 
     //some of the code not shown here creates a blue circle 
     [cell addSubview:cell.blueCircle]; 
    } 
    else { 
     NSLog(@"Odd indexPath: %@", indexPath); 
     //some of the code not shown here creates a green rectangle 
     [cell addSubview:cell.greenRect]; 
    } 
} 

請注意,我只能得到一個NSLog,無論是奇數還是偶數,爲什麼我會得到兩個形狀而不是一個?

我有一種感覺,在調用這個消息之前,其中一個形狀會以某種方式(不確定它是如何工作的)從前一個單元格移動到新單元格中,但我確實有懶惰的「nilization」與此戰鬥。

你對此有何看法?

回答

5

由於單元格是從重用隊列中提取的,因此除非您告訴它們使用-setNeedsDisplayInRect:重繪並傳入需要重繪的髒重塊,否則它們不會完全重繪。否則,當繪製greenSquare的矩形時,需要繪製blueCircle的矩形,反之亦然。

我相信發生的事情是過去畫出的綠色方塊,單元格在屏幕滾動後被添加到重用隊列中,然後從重新使用隊列中拉出單元格以填充新數據,然後藍色的圓圈恰好在當前的通道上繪製,但綠色方塊所繪製的矩形從未失效並重新繪製。

+0

這真棒,我有一種感覺,就是這樣的感覺。我只是不明白究竟是什麼。這個解釋對於像我這樣的第一次iOS的人來說確實很有幫助。 :)但是,rdelmar的解決方案比你的更好。所以我不確定,我應該給誰巧克力曲奇餅乾(checkmark)? @Andrew – GangstaGraham

+0

我決定選擇你作爲獲勝者,但我給了你們倆的讚揚 – GangstaGraham

3

將cell.blueCircle設置爲零可將指針設置爲零,但不會刪除blueCircle。由於藍色圓圈是細胞的子視圖,因此細胞有強烈的指向它的指針。您需要將其從超級視圖中移除。

[cell.blueCircle removeFromSuperview]; 
[cell.greenRect removeFromSuperview]; 
+0

是的,這工作。 :)我看到安德魯的答案後,我實際上嘗試了這一點,這幫助我瞭解我出錯的地方。但是,你的解決方案比他更好。所以我不確定,我應該給誰巧克力曲奇餅乾(checkmark)?也許增強你的解釋與安德魯的競爭。 @rdelmar – GangstaGraham

+0

@GangstaGraham,安德魯的文章實際上回答你的問題是如何發生的,我的只是告訴你如何解決它,所以選擇你喜歡的。 – rdelmar

+0

我決定選擇安德魯作爲獲勝者,因爲他幫助我更好地理解了這種情況,但是我給了你們兩個人的提議,再加上你們已經得到了你們公平的分數:P @ rdelmar – GangstaGraham