为什么UITableView单元格在滚动时重叠?

我有一个约100行的UITableView

每个单元格都检查过图像,但是当我们滚动UITableView ,所有的单元格都会在未选中的单元格中重叠。

 (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *MyIdentifier = @"Cell"; static NSString *MyIdentifierAds = @"Cell1"; UITableViewCell *cell ; if (tableView==self.tblSeachMarketplace) { if (indexPath.section==0) { cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; // if(cell== nil) // { // cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; // } UILabel* lblTitle = (UILabel *)[cell viewWithTag:200]; UILabel*lblSubheading = (UILabel *)[cell viewWithTag:300]; UIImageView* imgRating = (UIImageView *)[cell viewWithTag:400]; UIImageView* imgLogo = (UIImageView *)[cell viewWithTag:100]; [lblTitle setFont:[UIFont fontWithName:@"Lato-Bold" size:12.5f]]; [lblSubheading setFont:[UIFont fontWithName:@"Lato-Bold" size:9.0f]]; [lblTitle setFont:[UIFont fontWithName:@"Lato-Bold" size:12.5f]]; [lblSubheading setFont:[UIFont fontWithName:@"Lato-Bold" size:9.0f]]; [lblTitle setTextColor:[Global colorFromHexString:@"#4394d4"]]; NSDictionary*row=[[NSDictionary alloc]init]; cell.contentView.backgroundColor = [UIColor whiteColor]; if (allMarketPlaceNewsletters.count>0) { row=[allMarketPlaceNewsletters objectAtIndex:indexPath.row]; NSString *imgUrl=[row valueForKey:@"logo"]; if (imgUrl != (id)[NSNull null]) { NSURL *urlTemp = [NSURL URLWithString:imgUrl]; [imgLogo setImageWithURL:urlTemp placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; } UIButton *btnLocationRight=(UIButton *)[cell viewWithTag:600]; UIButton *btnLocationPlus=(UIButton *)[cell viewWithTag:500]; if ([[row valueForKey:@"subscribed"] isEqualToString:@"Y"]) { [btnLocationRight setHidden:NO]; [btnLocationPlus setHidden:YES]; cell.contentView.backgroundColor = [Global colorFromHexString:@"#f0f9fc"]; [btnLocationRight setImage:[UIImage imageNamed:@"righbtn.png"] forState:UIControlStateNormal]; [btnLocationRight setTag:indexPath.row]; // [btnLocationRight addTarget:self action:@selector(ButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; // [cell addSubview:[self buttonWithMap:cell :@"righbtn.png":indexPath.row]]; }else{ cell.contentView.backgroundColor = [UIColor whiteColor]; [btnLocationPlus setTag:indexPath.row]; [btnLocationPlus addTarget:self action:@selector(ButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; [btnLocationPlus setImage:[UIImage imageNamed:@"darkplusbtn.png"] forState:UIControlStateNormal]; [btnLocationRight setHidden:YES]; [btnLocationPlus setHidden:NO]; // [cell addSubview:[self buttonWithMap:cell :@"darkplusbtn.png" :indexPath.row]]; } NSString *stars=[NSString stringWithFormat:@"%d.png",[[row valueForKey:@"rating"] intValue]]; imgRating.image=[UIImage imageNamed:stars]; } 

你的代码是非常错误的…正如我所看到的,你通过界面生成器来创build你的单元格。 在这种情况下,您可以为它创build自定义的UITableViewCell类,它将IBOutlets到您的UILabelsUIImageViews (以及其他您喜欢的UI元素)中。 这将确保您的UI元素为您创build,并且您不必在您的cellForRow方法中使用alloc-initaddSubview

在这里解释所有的东西需要相当长的时间,所以你可以看看这个教程 ,它解释了如何更好地创build自定义的UITableViewCells 。 主要Option 2: Prototype Cells是你所需要的。

cellForRowAtIndexPath添加此代码

 NSArray *subviews = [[NSArray alloc] initWithArray:cell.contentView.subviews]; for (UIView *subview in subviews) { if([subview isKindOfClass:[UIView class]]) [subview removeFromSuperview]; else if([subview isKindOfClass:[UIImageView class]]) [subview removeFromSuperview]; else if([subview isKindOfClass:[UILabel class]]) [subview removeFromSuperview]; else if([subview isKindOfClass:[UIImage class]]) [subview removeFromSuperview]; else if([subview isKindOfClass:[UIButton class]]) [subview removeFromSuperview]; } [subviews release]; 

希望这会帮助你。提前感谢你。