UITableViewCell - 与以前的单元格内容重叠

Posted

技术标签:

【中文标题】UITableViewCell - 与以前的单元格内容重叠【英文标题】:UITableViewCell - overlapping with previous cells contents 【发布时间】:2011-01-25 06:38:14 【问题描述】:

我的桌子有这个奇怪的问题

    我有大约 20 个单元格要显示 每个单元格的高度约为 84 像素 当我单击 no 单元格时,我设置了背景颜色 前 4 个单元格没问题,但是当我向下滚动并单击第 5 个单元格时,每个单元格的内容开始与其他一些内容重叠,通常是第 4 个单元格的内容。

我相信它有一些细胞可重用性或绘图问题。不知道如何解决它,我已经检查了我的代码,但我没有在触摸时更改单元格的内容。

这是我的代码,也会添加一些图片

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

    return 104;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 

     return [stores count];


-(UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    static NSString *CellIdentifier = @"Cell";
    CGRect Label1Frame = CGRectMake(5, 5, 250, 30);
    CGRect Label2Frame = CGRectMake(6, 42, 220, 20);    
    CGRect Label3Frame = CGRectMake(6, 62, 220, 20);        
    CGRect Label4Frame = CGRectMake(240,56, 70, 12);            

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil) 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    else
        // a cell is being recycled, remove the old edit field (if it contains one of our tagged edit fields)
        UIView *viewToCheck = nil;
        viewToCheck = [cell.contentView viewWithTag:1];
        if (!viewToCheck) 
            [viewToCheck removeFromSuperview];
            DebugLog(@"View removed");
               
    
    //cell.selectionStyle=UITableViewCellSelectionStyleNone;
    [cell setSelectedBackgroundView:bgView];    
    NSInteger row=indexPath.row;
    UILabel *lblTemp;
    [[cell contentView] clearsContextBeforeDrawing];

    //Line 1

    lblTemp=[[UILabel alloc] initWithFrame: Label1Frame];
    lblTemp.tag=1;
    lblTemp.text=[[stores objectAtIndex:row] objectAtIndex:0] ;
    lblTemp.numberOfLines=2;
    lblTemp.font = [UIFont boldSystemFontOfSize:13];
    lblTemp.adjustsFontSizeToFitWidth=YES;
    lblTemp.minimumFontSize=12;
    lblTemp.textColor = [UIColor grayColor];
    [cell.contentView addSubview:lblTemp];  
    [lblTemp release];
    //Line 2
    lblTemp = [[UILabel alloc] initWithFrame:Label2Frame];
    lblTemp.tag = 2;
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:1];   
    lblTemp.font = [UIFont systemFontOfSize:12];
    lblTemp.textColor = [UIColor grayColor ];
    lblTemp.textAlignment=UITextAlignmentLeft;
    lblTemp.adjustsFontSizeToFitWidth=YES;
    lblTemp.minimumFontSize=12;

    [cell.contentView addSubview:lblTemp];  
    [lblTemp release];

    //Line 3    
    lblTemp = [[UILabel alloc] initWithFrame:Label3Frame];
    lblTemp.tag = 3;
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:2];
    lblTemp.font = [UIFont systemFontOfSize:12];
    lblTemp.textColor = [UIColor grayColor ];
    [cell.contentView addSubview:lblTemp];      
    [lblTemp release];
    //Phone button
    UIButton *phoneButton=[[UIButton alloc] initWithFrame:CGRectMake(240,16,30,30)];
    [phoneButton setBackgroundImage:[UIImage imageNamed:@"phone.png"] forState:UIControlStateNormal];
    [phoneButton setTag:row];
    [phoneButton addTarget:self action:@selector(dialNumber:) forControlEvents:UIControlEventTouchUpInside];
    [cell.contentView addSubview:phoneButton];
    //ANnotation button
    UIButton *annotation=[[UIButton alloc] initWithFrame:CGRectMake(274,16,30,30)]; 
    [annotation setTag:row];
    [annotation setBackgroundImage:[UIImage imageNamed:@"tab.png"] forState:UIControlStateNormal];
    [annotation addTarget:self action:@selector(openMap:) forControlEvents:UIControlEventTouchUpInside];    
    [cell.contentView addSubview:annotation];   
    [annotation release];
    //Distance label
    //Line 3    
    lblTemp = [[UILabel alloc] initWithFrame:Label4Frame];
    lblTemp.tag = 4;
    lblTemp.text=[[stores objectAtIndex:row]objectAtIndex:5];   
    lblTemp.textAlignment=UITextAlignmentCenter;
    lblTemp.font = [UIFont systemFontOfSize:13];
    lblTemp.textColor = [UIColor grayColor ];
    [lblTemp setAdjustsFontSizeToFitWidth:YES];
    [cell.contentView addSubview:lblTemp];      
    [phoneButton release];
    [lblTemp release];  
    [cell setNeedsLayout];
    [cell setNeedsDisplay];
    return cell;

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

    UITableViewCell *cell=[tableView cellForRowAtIndexPath:indexPath ];   
    for(UILabel *lbl in cell.contentView.subviews)
        if([lbl isKindOfClass:[UILabel class]])
            lbl.textColor=[UIColor whiteColor];

        
    
    //UITableViewCell *cell1;       
    //NSString *row=[NSString stringWithFormat:@"%d",indexPath.row];
    svm = [[storesMapView alloc] initWithNibName:@"storesMapView" bundle:nil];
    [svm initWithXML:stores:indexPath.row];
    CGRect theFrame = svm.view.frame;
    theFrame.origin = CGPointMake(self.view.frame.size.width, 0);
    svm.view.frame = theFrame;
    theFrame.origin = CGPointMake(0,0);
    theFrame.size=CGSizeMake(320,355);
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.3f];
    svm.view.frame = theFrame;
    [UIView commitAnimations];
    [subView addSubview:svm.view];
    backButton.hidden=NO;



【问题讨论】:

你真的应该在笔尖中构建这样的单元格,而不是在 cellForRow 中制作所有内容。 你也可以在这里看到答案。解释清楚。 ***.com/questions/8999300/… 我有同样的问题,但我的子视图没有在代码中实例化,而是来自故事板。如果删除子视图,它们都消失了。我该如何解决这个问题? 【参考方案1】:

我通过反复试验找到了答案;如果这可以帮助某人

在 cellforRowAtIndexPath 中,我尝试在绘制单元格之前清除所有单元格子视图

//TRY TO REMOVE ALL CONTENT
    for(UIView *view in cell.contentView.subviews)
        if ([view isKindOfClass:[UIView class]]) 
            [view removeFromSuperview];
        
    

如果有人能指出一些更简单的方法,我会很高兴

谢谢

【讨论】:

更简单的方法是把所有动态添加的视图放到一个公共子视图中,并在 UITableViewCell 的 prepareForReuse 方法中删除所有这个视图的子视图 @NikolayKasyanov 的上述建议是正确的做法。【参考方案2】:

您可以使用

[[[cell contentView] subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];

如果单元格不为零,上面的代码将减少使用类似于此的for循环的时间

for(UIView *eachView in [cell subviews])
    [eachView removeFromSuperview];

【讨论】:

【参考方案3】:

我也有同样的问题。我也用标签组成了 tableView。当我向下滚动它时,内容重叠了。但只需通过编辑 cellForRowAtIndexPath 中的一条语句就可以解决。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:nil];

我认为这将解决您的问题。

【讨论】:

【参考方案4】:

我知道这有点晚了,但我遇到了类似的问题,为单元格创建的 UILabel 在重复使用时仍然是单元格的一部分。因此,tableview 的每次连续更新都会在现有的 UILabel 之上创建另一个 UILabel。我将标签的创建移到了 if 条件中,如下所示,它解决了我的问题。希望它可以帮助别人。另请注意,因为我使用的是 ARC,所以没有发布。

    static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 

    

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];

    cityText = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 20)];
    cityText.font = [UIFont fontWithName:@"Arial" size:20];
    cityText.textAlignment = UITextAlignmentLeft; 
    cityText.backgroundColor = [UIColor clearColor];

    regionText = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 100, 20)];
    regionText.font = [UIFont fontWithName:@"Arial" size:20];
    regionText.textAlignment = UITextAlignmentLeft; 
    regionText.backgroundColor = [UIColor clearColor];

    

【讨论】:

【参考方案5】:

nil 设置为 UITableViewCell 子类的方法 prepareForReuse() 上的文本标签解决了我的问题 -

  override func prepareForReuse() 
    super.prepareForReuse()
    self.label1.text = nil
    self.label2.text = nil
    ....

如果对任何人有帮助,请分享!

【讨论】:

以上是关于UITableViewCell - 与以前的单元格内容重叠的主要内容,如果未能解决你的问题,请参考以下文章

点击时 UItableviewcell 背景颜色

UITableViewCell 与 UIScrollView 防止单元格触摸

如何将 UITextView 嵌入 UITableViewCell 与作为委托的自定义单元格?

自定义 UITableViewCell 前导对齐到右细节单元格

UITableViewCell - 将所有单元格更改为 BackgroundView

单击另一个单元格时将 UITableViewCell 折叠到原始大小