我正在尝试仅在UITableView中的某些单元格中显示图像。这是我的configureCell方法:

-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    StoryInfo *info = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UIImage *ribbon = [UIImage imageNamed:@"ribbon.png"];
    UIImageView *ribbonView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
    [ribbonView setImage:ribbon];
    [cell addSubview:ribbonView];
    if([[NSNumber numberWithBool:NO] isEqualToNumber:info.visited]) {
        cell.textLabel.textColor = [UIColor colorWithRed:53/255.0 green:53/255.0 blue:52/255.0 alpha:1];
        ribbonView.hidden = NO;
    }
    else {
        cell.textLabel.textColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];
        ribbonView.hidden = YES;
    }
}

这是cellForRowAtIndexPath:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    // set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

这不太有效,因为首先,所有单元格都将它们绘制RibbonView,而不管info.visited的值如何。我已经逐步了解了if / else,但是看到了隐藏代码。但是,如果我离开列表,然后再返回,则可以看到正确的功能区状态。滚动表格视图会再次使其中断。

字体颜色始终是正确的。

最佳答案

如果您正在重用单元格,则可能是您正在向该单元格添加多个ribbonView子视图,因此,即使当前info.visitedindexPathNO,在该单元格上仍然有另一个RibbonView仍然可以看到。

要做的事情是确保您只有一个ribbonView子视图,可以通过在配置方法中删除旧的ribbonViews来实现,也可以通过将UITableViewCell子类化并向该单元格添加ribbonView属性来更好地实现,该属性只需设置一次并添加到单元格的视图层次结构一次,然后可以在配置方法中访问并将其设置为hiddenNO

编辑:单元格文本的颜色将始终是正确的,因为您要更改单元格视图层次结构中YES的一个实例的颜色。如果您的配置方法每次配置时都向该单元格添加一个新的UILabel子视图,我希望您会看到相同的错误行为。

编辑:尝试的代码

-(void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    static NSInteger ribbonTag = 12345;
    StoryInfo *info = [self.fetchedResultsController objectAtIndexPath:indexPath];
    // re-use a ribbonView if one's already been added to this cell
    UIImageView *ribbonView = [cell.contentView viewWithTag:ribbonTag];
    if (!ribbonView){
       ribbonView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 15, 15)];
       ribbonView.tag = ribbonTag;
       UIImage *ribbon = [UIImage imageNamed:@"ribbon.png"];
       [ribbonView setImage:ribbon];
       // add subviews to contentView
       [cell.contentView addSubview:ribbonView];
    }
    if([[NSNumber numberWithBool:NO] isEqualToNumber:info.visited]) {
        cell.textLabel.textColor = [UIColor colorWithRed:53/255.0 green:53/255.0 blue:52/255.0 alpha:1];
        ribbonView.hidden = NO;
    }
    else {
        cell.textLabel.textColor = [UIColor colorWithRed:128.0/255.0 green:128.0/255.0 blue:128.0/255.0 alpha:1.0];
        ribbonView.hidden = YES;
    }
}

关于ios - 有条件地在UITableViewCell中显示图像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15451469/

10-08 23:30