2011-07-24 383 views
1

我創建了一個自定義的UITableViewCell,但在更新單元格內容時遇到了問題。當我在表格中有多個單元格時,表格未在單元格中繪製正確的圖像。每個單元格中的圖像應該是唯一的,但是我看到不同的單元格具有相同的圖像。該表似乎是隨機放置細胞。UITableViewCell沒有正確更新

我用NSLog檢查了我的數據源,名稱正確。當我不使用- (UITableViewCell *)dequeueReusableCellWithIdentifier:(NSString *)identifier時,我可以更正此問題,但每次在- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath時都會創建一個新單元。

任何關於我可能做錯的建議?請看下面我的代碼。

- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    ScoreCell *cell = (ScoreCell *)[_tableView dequeueReusableCellWithIdentifier:@"CellID"]; 

    if (cell == nil) 
    { 
     cell = [[[ScoreCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellID"] autorelease]; 
    } 

    BoxScore *boxScore = [_gameDayData objectAtIndex:indexPath.row]; 
    [cell setScoreImage:[UIImage imageNamed:boxScore.name]]; 

    return cell; 
} 

ScoreCell.h

@interface ScoreCell : UITableViewCell 
{ 
    UIImage *scoreImage; 
} 

@property(nonatomic, retain)UIImage *scoreImage; 

@end 

ScoreCell.m

@implementation ScoreCell 

@synthesize scoreImage; 

- (void)dealloc 
{ 
    [scoreImage release], scoreImage = nil; 
} 


- (void)drawRect:(CGRect)rect 
{ 
    [super drawRect:rect]; 

    [scoreImage drawAtPoint:CGPointMake(5,5)]; 
} 

@end 
+0

這個類名不要jive - 我希望這是在這裏發佈snippits的神器 – bshirley

+0

謝謝,這是一個神器。固定。 – David

+0

表面隨機性不可能是隨機的 - 當一個單元格滾動出視圖時,它會被重用。一個是從另一側滾動,如果狀態沒有被你的代碼正確重置,你會得到你看到的行爲 – bshirley

回答

3

圖像處理有兩個與圖像處理無關的問題。 滾動關閉並在屏幕上將導致一個單元格加載圖像兩次(或一百次,取決於用戶)。

你想要一個

- (UIImage *)boxScoreImageForIndex:(NSInteger)index 

方法(懶惰)負載,扶住,併爲細胞的圖像。

你也不想使用imageNamed:,在你的情況下,它會導致內存使用量超過需要的兩倍。改爲使用imageWithContentsOfFile:

+0

出於某種原因,'imageWithContentsOfFile:'工作並且'imageNamed:'沒有。我還添加了'[cell setNeedsDisplay]'。謝謝。 – David

0

您還沒有清除之前的圖像。當一個單元出隊時,它不被處理。

因此,有時在單元格上繪製的圖像會在新圖像前顯示。

在drawRect中,您需要清除所有內容。

要麼是:

CGContextClearRect(context , [self bounds]); 
對細胞

或者設置clearsContextBeforeDrawing創建時。

+0

'clearsContextBeforeDrawing'默認設置爲yes。我不太確定'CGContextClearRect'。 – David

5

除了其他意見,請務必在您的ScoreCell類中實施-prepareForReuse方法。當細胞被重新使用時,它會被調用,此時應該清除圖像。請務必在實施中致電[super prepareForReuse];。這將防止細胞被錯誤的圖像重複使用。

+1

感謝您的提示。我認爲'prepareForReuse'是放置'setNeedsDisplay'好得多的地方,它強制單元重繪它的內容。 – David