2009-10-20 77 views
1

我有下面的代碼來填充我的UITableView。IPHONE:不釋放內容的UITableView單元

我必須顯示兩種單元格:一個帶有背景圖像的常規單元格和一個帶有常規背景圖像的單元格,外加一個標籤和一個按鈕。

如果Indexpath.row小於控制變量,則繪製常規單元格。如果沒有,繪製帶有按鈕和標籤的單元格。

這是代碼

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *MyIdentifier = @"MyIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:MyIdentifier] autorelease]; 
    } 


    UIImage *imageU; 

    if (indexPath.row < controlVariable) { 

     imageU = [[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] 
       pathForResource:[NSString stringWithFormat: @"table%d", indexPath.row] ofType:@"jpg"]] autorelease]; 

     cell.imageView.image = imageU; 

    } else { 

     imageU = [[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] 
         pathForResource:[NSString stringWithFormat: @"table-pg%d",numberX] 
                 ofType:@"jpg"]] autorelease]; 
     cell.imageView.image = imageU; 



     NSString * myString = [NSString stringWithFormat: @"pago%d", numberX]; 
     UILabel * myLabel = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 49.0, 200.0, 22.0)]; 
     [myLabel setTextAlignment:UITextAlignmentLeft]; 
     [myLabel setBackgroundColor:[UIColor blueColor]]; 
     [myLabel setClipsToBounds:YES]; 
     [myLabel setFont:[UIFont systemFontOfSize:14.0]]; 
     [myLabel setTextColor:[UIColor blackColor]]; 
     [myLabel setText: myString]; 
     [myLabel setAlpha:0.6]; 
     [cell addSubview: myLabel]; 
     [myLabel release]; 


     UIButton *buyButton = [[UIButton alloc] initWithFrame:CGRectMake(220, 4, 100, 35)]; 

     buyButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     buyButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter; 

     [buyButton setTitle:NSLocalizedString(@"buyKey", @"") forState:UIControlStateNormal]; 
     [buyButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 
     buyButton.titleLabel.font = [UIFont boldSystemFontOfSize:14]; 

     UIImage *newImage = [[[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle] 
          pathForResource: @"whiteButton" ofType:@"png"]] autorelease] 
           stretchableImageWithLeftCapWidth:12.0f topCapHeight:0.0f]; 
     [buyButton setBackgroundImage:newImage forState:UIControlStateNormal]; 

     [buyButton addTarget:self action:@selector(comprar:) forControlEvents:UIControlEventTouchDown]; 

     buyButton.backgroundColor = [UIColor clearColor]; 

     [buyButton setTag:indexPath.row]; 
     [cell addSubview:buyButton]; 
     [buyButton release]; 

    } 

    return cell; 
} 

這段代碼的問題是:當我滾動的UITableView下來,達到普通細胞和細胞按鈕和標籤之間的分工,我認爲這是正確的渲染,但如果我深入後去,我會看到按鈕和標籤被添加到不應該有的單元格中。從這一刻起,所有單元格都包含按鈕和標籤...

這就好像單元在繪製之前不會釋放其內容。這就像標籤和按鈕被添加到單元格上已有的其他按鈕和標籤之上。細胞在再次繪製之前不會釋放其內容。

如何解決?

感謝您的任何幫助。

注:我看到兩個第一個答案建議的更改後幾乎沒有區別。現在,並非所有的細胞都是錯的,只是一些。每當我向下滾動表格並返回到表格的開頭時,它們都會發生變化。

回答

5

對於您正在使用的每個單元'類型',您應該使用單獨的reuseIdentifier。在這種情況下,你需要使用兩個。

你還需要創建/加入UILabelUIButton當你得到一個出隊小姐而不是爲每個通過..運行在僞代碼:

UILabel * lbl; 
UIButton * btn; 
cell = [table dequeueReusableCellWithIdentifier:correctIdentifier]; 
if (cell == nil) 
{ 
    cell = ...; // alloc cell 
    lbl = ...; 
    lbl.tag = kTagLabel; 
    [cell addSubView:lbl]; 
    btn = ...; 
    btn.tag = kTagButton; 
    [cell addSubView:btn]; 
} 
else 
{ 
    lbl = (UILabel*)[cell viewWithTag:kTagLabel]; 
    btn = (UIButton*)[cell viewWithTag:kTagButton]; 
} 

//... now set the text/image appropriately. 

否則,您創建一個標籤,每次單元從表中出隊時按鈕。向上滾動和向下滾動會導致大量標籤和按鈕被創建,永遠不會被釋放。

+1

謝謝,就是這樣! – SpaceDog 2009-10-20 22:24:06

+0

這非常有用,謝謝。另外,不要使用標籤,如0,1,2,3 – irco 2010-11-06 02:06:00

1

您應該使用兩種不同的reuseIdentifiers;一個用於顯示圖片的單元格,另一個用於顯示圖片和按鈕的單元格。問題在於你的一個單元格類型正在被重用,但其內容不是(也不應該)在出列時被清除。