2013-01-03 52 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

相关问题