2013-01-03 56 views
0

UITableView單元格正在重複滾動並相互重疊。 我怎樣才能解決這個問題在iPhone中重複和重疊UITableView單元格

這裏是我的代碼

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 11; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIButton *buyBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    UIImageView *img; 
    UILabel *lbl; 
    UIImageView *backImage; 
    UILabel *textLabel; 
    UILabel *detailTextLabel; 

    NSInteger val = [indexPath row] * 3; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)]; 
     [buyBtn setFrame:CGRectMake(257, 35, 57, 24)]; 
     img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)]; 

     lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)]; 
     textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)]; 
     detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)]; 

     backImage.image = [UIImage imageNamed:@"shop-bg.png"]; 
     [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal]; 
     [img setImage:[UIImage imageNamed:@"price_button.png"]]; 
    } 
    else 
    { 
     backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)]; 
     [buyBtn setFrame:CGRectMake(257, 35, 57, 24)]; 
     img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)]; 

     lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)]; 
     textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)]; 
     detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)]; 

     backImage.image = [UIImage imageNamed:@"shop-bg.png"]; 
     [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal]; 
     [img setImage:[UIImage imageNamed:@"price_button.png"]]; 
    } 



    lbl.center = img.center; 
    lbl.textAlignment = UITextAlignmentCenter; 
    lbl.text = [self.original_List objectAtIndex:val+2]; 
    lbl.backgroundColor = [UIColor clearColor]; 

    textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:14]; 
    textLabel.backgroundColor = [UIColor clearColor]; 
    textLabel.text = [self.original_List objectAtIndex:val]; 

    detailTextLabel.text = [self.original_List objectAtIndex:val+1]; 
    detailTextLabel.backgroundColor = [UIColor clearColor]; 
    detailTextLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:10]; 
    textLabel.textColor = [UIColor blackColor]; 
    detailTextLabel.textColor = [UIColor whiteColor]; 
    detailTextLabel.numberOfLines = 2; 

    [buyBtn setTag:[indexPath row]]; 
    [buyBtn addTarget:self action:@selector(buyBtnPressed:) forControlEvents:UIControlEventTouchDown]; 



    static NSString *myIdentifier = @"myIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
    NSLog(@"%d" , [[cell subviews] count]); 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier]; 
    } 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     [cell setSelectionStyle:UITableViewCellEditingStyleNone]; 
     cell.backgroundColor = [UIColor clearColor]; 

    [cell.contentView addSubview:backImage]; 
    [cell.contentView addSubview:detailTextLabel]; 
    [cell.contentView addSubview:textLabel]; 
    [cell.contentView addSubview:buyBtn]; 
    [cell.contentView addSubview:img]; 
    [cell.contentView addSubview:lbl]; 
    return cell; 
} 

回答

1

試試這個代碼: -

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UIButton *buyBtn = [UIButton buttonWithType:UIButtonTypeCustom]; 
    UIImageView *img; 
    UILabel *lbl; 
    UIImageView *backImage; 
    UILabel *textLabel; 
    UILabel *detailTextLabel; 

    NSInteger val = [indexPath row] * 3; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)]; 
     [buyBtn setFrame:CGRectMake(257, 35, 57, 24)]; 
     img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)]; 

     lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)]; 
     textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)]; 
     detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)]; 

     backImage.image = [UIImage imageNamed:@"shop-bg.png"]; 
     [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal]; 
     [img setImage:[UIImage imageNamed:@"price_button.png"]]; 
    } 
    else 
    { 
     backImage = [[UIImageView alloc] initWithFrame:CGRectMake(2, 4, 316, 62)]; 
     [buyBtn setFrame:CGRectMake(257, 35, 57, 24)]; 
     img = [[UIImageView alloc] initWithFrame:CGRectMake(257, 10, 57, 24)]; 

     lbl = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 57, 24)]; 
     textLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 230, 25)]; 
     detailTextLabel = [[UILabel alloc] initWithFrame:CGRectMake(4, 25, 230, 30)]; 

     backImage.image = [UIImage imageNamed:@"shop-bg.png"]; 
     [buyBtn setImage:[UIImage imageNamed:@"buy_button"] forState:UIControlStateNormal]; 
     [img setImage:[UIImage imageNamed:@"price_button.png"]]; 
    } 



    lbl.center = img.center; 
    lbl.textAlignment = UITextAlignmentCenter; 
    lbl.text = [self.original_List objectAtIndex:val+2]; 
    lbl.backgroundColor = [UIColor clearColor]; 

    textLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:14]; 
    textLabel.backgroundColor = [UIColor clearColor]; 
    textLabel.text = [self.original_List objectAtIndex:val]; 

    detailTextLabel.text = [self.original_List objectAtIndex:val+1]; 
    detailTextLabel.backgroundColor = [UIColor clearColor]; 
    detailTextLabel.font = [UIFont fontWithName:@"Arial Rounded MT Bold" size:10]; 
    textLabel.textColor = [UIColor blackColor]; 
    detailTextLabel.textColor = [UIColor whiteColor]; 
    detailTextLabel.numberOfLines = 2; 

    [buyBtn setTag:[indexPath row]]; 
    [buyBtn addTarget:self action:@selector(buyBtnPressed:) forControlEvents:UIControlEventTouchDown]; 



    static NSString *myIdentifier = @"myIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
    NSLog(@"%d" , [[cell subviews] count]); 
    //if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier]; 
    } 
      cell.accessoryType = UITableViewCellAccessoryNone; 
     [cell setSelectionStyle:UITableViewCellEditingStyleNone]; 
     cell.backgroundColor = [UIColor clearColor]; 

    [cell.contentView addSubview:backImage]; 
    [cell.contentView addSubview:detailTextLabel]; 
    [cell.contentView addSubview:textLabel]; 
    [cell.contentView addSubview:buyBtn]; 
    [cell.contentView addSubview:img]; 
    [cell.contentView addSubview:lbl]; 
    return cell; 
} 
0

您需要檢查細胞高度 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;

它應該大於代碼中使用的最大高度可能是65

0

請勿使用reuseIdentifier並將其設置爲nil。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil]; 


    } 
0

這裏發生的事情是,你使用

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier];

此代碼可以確保當你在一個UITableView滾動,細胞得到重用,以節省內存。由於您對所有單元格使用相同的標識符,因此它只會重用已具有「backImage」,「detailTextLabel」等的單元格,並將新的視圖組件添加到已有的單元格之上。

你可以通過使用類似下面的代碼解決這個問題:

static NSString *myIdentifier = @"myIdentifier"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
if (cell == nil) 
{ 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:myIdentifier]; 
    // Create backImage, detailTextLabel, etc. here 
    ... 

    // Give view components tags 
    backImage.tag = 1; 
    detailTextLabel.tag = 2; 
    ... 
} 

UIImageView* retrievedBackImage = (UIImageView*)[cell.contentView viewWithTag:1]; 
UILabel* retrievedDetailTextLabel = (UILabel *)[cell.contentView viewWithTag:2]; 
... 
// Initialise values 
retrievedBackImage.image = [UIImage imageNamed:@"someImage.png"]; 
retrievedDetailTextLabel.text = @"something"; 
... 

希望這是有幫助的。

Nicolas

相關問題