UIimageview 在 uitableviewcell 中显示不止一次

Posted

技术标签:

【中文标题】UIimageview 在 uitableviewcell 中显示不止一次【英文标题】:UIimageview showing more than one time in uitableviewcell 【发布时间】:2016-05-18 09:15:24 【问题描述】:

我的应用程序中有一个正在加载 xml 菜单的表。我在其中为每个单元格放置了一个 uiimageview 作为项目符号图像。但我的问题是第一个时间表显示正确(一个单元格中的一个图像)但是当我在菜单中进一步向下滚动时。它开始在一个单元格中显示图像 3 次。我将发布我的代码。

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"menuCell";
    UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    
    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-bold" size:18];
    if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"1"]) 
        cell.textLabel.textColor = [UIColor redColor];
        [cell setIndentationLevel:3];
        [cell setIndentationWidth:10];
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(5,cell.frame.size.height/2+5, 15, 15)];

    else if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"2"]) 
        cell.textLabel.textColor = [UIColor blueColor];
        [cell setIndentationLevel:6];
        [cell setIndentationWidth:10];
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(35,cell.frame.size.height/2+5, 13, 13)];

    else if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"3"]) 
        cell.textLabel.textColor = [UIColor lightGrayColor];
        [cell setIndentationLevel:9];
        [cell setIndentationWidth:10];
        cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(65,cell.frame.size.height/2+5, 11, 11)];
    
    cell.textLabel.text = [[rssOutputData objectAtIndex:indexPath.row]xmltitle];

    cellImage.image=[UIImage imageNamed:@"arrow.png"];
    [cell addSubview:cellImage];


    return cell;

这就是实际发生的事情。

【问题讨论】:

只需在cell == nil 中添加imageView 并为图像视图设置tag 值。他们使用viewWithTab: 获取图像视图,然后设置图像视图 你试过我下面的答案了吗 是的,我确实试过了,它停止了箭头的重复,但现在图像没有显示它应该显示的位置我的意思是它的框架不正确,因为我想要我在 if ([[[rssOutputData objectAtIndex :indexPath.row]xmlid] isEqualToString:@"1"]) 什么是xmlid?以及为什么要设置不同的indentation levelindentation width 【参考方案1】:

cellImage = nil; 添加为方法的第一行,您的问题将得到解决。

更新:

尝试在单元格的contentview中添加cellImage,而不是像单元格一样,

[cell.contentView addSubview: cellImage];

希望这会有所帮助:)

【讨论】:

你也在didselectrow中设置图片吗? 同样的问题。谢谢 现在您应该创建customtabelview 类并从awakeFromNib 方法添加imageview。不要从cellforrowatindexpath 添加。只需从此方法更改框架。它可能会解决您的问题【参考方案2】:

如果您在 Storyboard 中创建 tableView,请仔细检查 storyboard 中的 cell identifier

而且您的细胞正在被重复使用,这就是您看到这种行为的原因。

不要在 Cell 中添加 Image,而是在 ContentView 中添加 Image。

   [cell.contentView addSubview:MyImageView];

【讨论】:

tabelview 是在子视图中以编程方式创建的,我将其用作 self.view 的菜单 查看此链接***.com/questions/20118286/… ***.com/questions/28556172/…【参考方案3】:

因为这条线

[cell addSubview:cellImage];

当您滚动时,会调用 cellForRowAtIndexPath,并将图像视图添加到您的表格视图单元格中。

要解决这个问题,有一些解决方案:

编写您的自定义单元格类,在 layoutSubViews 中初始化一次图像视图, 并且只更改 cellForRowAtIndexPath 中的图像内容。

在自定义单元格 xib 中创建图像视图并将出口添加到自定义 细胞类

【讨论】:

【参考方案4】:

用此代码替换您的代码,

- (UITableViewCell *)tableView:(UITableView *)theTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *cellIdentifier = @"menuCell";
    UITableViewCell *cell = (UITableViewCell *)[theTableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) 
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

        UIImageView *cellImage = [[UIImageView alloc]initWithFrame:CGRectZero];
        [cellImage setTag:100];
        [cell.contentView addSubview:cellImage];
    
    cell.backgroundColor = [UIColor clearColor];
    cell.textLabel.font = [UIFont fontWithName:@"HelveticaNeue-bold" size:18];

    if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"1"]) 
    cell.textLabel.textColor = [UIColor redColor];
    [cell setIndentationLevel:3];
    [cell setIndentationWidth:10];
    [cellImage setFrame:CGRectMake(5,cell.frame.size.height/2+5, 15, 15)];

else if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"2"]) 
    cell.textLabel.textColor = [UIColor blueColor];
    [cell setIndentationLevel:6];
    [cell setIndentationWidth:10];
    [cellImage setFrame:CGRectMake(35,cell.frame.size.height/2+5, 13, 13)];

else if ([[[rssOutputData objectAtIndex:indexPath.row]xmlid] isEqualToString:@"3"]) 
    cell.textLabel.textColor = [UIColor lightGrayColor];
    [cell setIndentationLevel:9];
    [cell setIndentationWidth:10];
    [cellImage setFrame:CGRectMake(65,cell.frame.size.height/2+5, 11, 11)];


    cell.textLabel.text = [[rssOutputData objectAtIndex:indexPath.row]xmltitle];

    cellImage.image=[UIImage imageNamed:@"arrow.png"];


    return cell;

【讨论】:

我什至通过评论这部分来尝试“UIImageView *cellImage = [[UIImageView alloc]initWithFrame:CGRectZero];”在单元格 == nill 但之后再次重复 n 全部 看到我每次都添加cellImage = [[UIImageView alloc]initWithFrame:CGRectMake(35,cell.frame.size.height/2+5, 13, 13)]; ,这对你来说是个问题[cellImage setFrame:CGRectMake(65,cell.frame.size.height/2+5, 11, 11)]; 每次您分配一个新的 UIImageView 并将其添加到单元格时,因此只会出现多个图像视图【参考方案5】:

请将此行添加到- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

cell.clipsToBounds=YES;

【讨论】:

【参考方案6】:

分配一次imageView 并将tag 分配给imageView 并使用该标签显示图像和 使用:

[cell.contentView addSubview:MyImageView];

你的问题就解决了

【讨论】:

以上是关于UIimageview 在 uitableviewcell 中显示不止一次的主要内容,如果未能解决你的问题,请参考以下文章

使用UITableView自动在UITableView上滚动UIImageView

如何在 UITableView 的单元格中为 UIImageView 获取 touchesMoved?

在具有透明度的 UITableView 单元格中更新 UIImageView

如何在 UITableView 的两个部分之间插入 UIImageView?

在 UITableView 中有一个带有圆角的 UIImageView 的确定方法?

在 UITableView 内的 UIImageView 中从 Web 加载图像