3

我有一个UITableViewCell,我需要将插页式图像随机放入其中一些。这是有效的,但由于单元格的缓存,图像在表格的下方重复出现。假设我已经预先决定将图像放在单元格 1、12 和 25 中,这些单元格将有它们的图像,但在单元格 1 之后,单元格 4、8 等也可能包含第一个图像。

我猜我需要做的是专门告诉cellForRowAtIndexPath清除缓存并删除任何图像,如果它不符合添加图像的标准。我该怎么做呢?我已经尝试过elseif 语句来做出决定并分配图像。在那else方面,我尝试将UIImageView' 的图像设置为nil,但这并没有任何区别。

有没有其他方法可以清除缓存以防止这些图像定期向页面发送垃圾邮件?这是我的cellForRowAtIndexPath方法,当前最后一行中的行else对图像没有影响,所以他们(我认为)需要用有效的东西替换!

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    // Make and allocate the cell if necessary.
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier: @"Cell"];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: @"Cell"];
    }
    cell.lineLabel.text = [[self.fetchedResultsController objectAtIndexPath: indexPath] line];
    cell.actorLabel.text = [[self.fetchedResultsController objectAtIndexPath: indexPath] actor];
    [cell.lineLabel sizeToFitMultipleLines];

    // Get the size each label needs to be when constrained to set width and very long height (8000).
    CGSize labelSize = [cell.lineLabel.text sizeWithFont: cell.lineLabel.font constrainedToSize: CGSizeMake(265, 8000)];

    if ([[cellsToContainInterstitialImages allKeys] containsObject: [thisLine.lineID stringValue]]) {

        UIImageView *interstitialImage = [[UIImageView alloc] init];
        NSNumber *cellTypeNumber = [cellsToContainInterstitialImages valueForKey: [thisLine.lineID stringValue]];
        kInterstitialCellType cellType = [cellTypeNumber intValue];

        if (cellType == kInterstitialCellTypeFirst) {
            interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"man.png"]];
        }
        else if (cellType == kInterstitialCellTypeSecond) {
            interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"woman.png"]];
        }
        else {
            interstitialImage = [[UIImageView alloc] initWithImage: [UIImage imageNamed: @"child.png"]];
        }

        [interstitialImage setFrame: CGRectMake(10, cell.lineLabel.frame.size.height + cell.actorLabel.frame.size.height + 10, 150, 150)];
        [cell addSubview: interstitialImage];
    } else {
        UIImageView *interstitialImage = [[UIImageView alloc] init];
        [interstitialImage setImage: nil];
    }

    return cell;
}
4

3 回答 3

1

您的else代码分支不会将interstitialImage图像添加到单元格中。您应该更改代码以UIImageView在单元格的构造函数中添加 ,这样cellForRowAtIndexPath您就必须设置图像,而不是添加子视图。

添加UIImageView到你的CustomCell,使其私有,并提供一个属性供cellForRowAtIndexPath使用:

@interface CustomCell : UITableViewCell {
    UIImageView *_interstitialImage;
}
@property (nonatomic,readonly) UIImageView *interstitialImage;
@end

@implementation CustomCell 
-(id)initWithStyle:(UITableViewCellStyle) style reuseIdentifier:(NSString*)reuseId {
    if (self = [super initWithStyle:style reuseIdentifier:reuseId]) {
        _interstitialImage = [[UIImageView alloc] init];
         [_interstitialImage setImage: nil];
         [_interstitialImage setFrame: CGRectMake(10, cell.lineLabel.frame.size.height + cell.actorLabel.frame.size.height + 10, 150, 150)];
         [cell addSubview: _interstitialImage];
    }
    return self;
}
-(UIImageView*)interstitialImage {
    return _interstitialImage;
}
@end

现在你cellForRowAtIndexPath会使用cell.interstitialImage而不是一直分配新UIImageView的。这将避免多次添加图像:

if ([[cellsToContainInterstitialImages allKeys] containsObject: [thisLine.lineID stringValue]]) {
    NSNumber *cellTypeNumber = [cellsToContainInterstitialImages valueForKey: [thisLine.lineID stringValue]];
    kInterstitialCellType cellType = [cellTypeNumber intValue];

    if (cellType == kInterstitialCellTypeFirst) {
        [cell.interstitialImage setImage:[UIImage imageNamed: @"man.png"]];
    } else if (cellType == kInterstitialCellTypeSecond) {
        [cell.interstitialImage setImage:[UIImage imageNamed: @"woman.png"]];
    } else {
        [cell.interstitialImage setImage: [UIImage imageNamed: @"child.png"]];
    }
} else {
    [cell.interstitialImage setImage: nil];
}
于 2013-03-01T15:30:01.640 回答
0

最简单的解决方案应该是使用– tableView:willDisplayCell:forRowAtIndexPath:协议的方法UITableViewDelegate。用这种方法清洁你的细胞。

于 2013-03-01T15:32:40.953 回答
0

问题是在if您添加图像视图的部分。这意味着随着单元格的重复使用,您会不断添加越来越多的图像视图。

在该else部分中,您创建一个虚拟图像视图并将其图像设置为nil. 此代码不符合您的预期 - 清除任何现有图像。

您需要做的是确保您永远不会向单元格添加第二个图像视图。当您需要清除图像时,您会获得对现有图像视图的引用,而不是创建新的。

于 2013-03-01T15:34:15.273 回答