UITableViewCell的子视图偶尔会消失

时间:2012-07-19 00:17:18

标签: iphone objective-c ios uitableview

我有一个UITableViewCell子类,它有一个名为entryView的属性,代替只读的cell.contentView。我以为我正在使用表格视图 - 记住每个条目都会重复使用单元格,每次都需要添加所有内容。但是,有时滚动时,entryView将在单元格上消失。单元格仍然存在,但entryView似乎从superview中删除。这是我的cellForRowAtIndexPath:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    JTimelineCell *cell = (JTimelineCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[JTimelineCell alloc] initWithStyle:UITableViewCellStyleDefault
                                    reuseIdentifier:CellIdentifier];

    }

    JTimelineCellContentView *contentView;

    Entry *entry = [_fetchedResultsController objectAtIndexPath:indexPath];

    if ([self.cellContentCache objectForKey:entry.entryID]) {
        contentView = [self.cellContentCache objectForKey:entry.entryID];

        contentView.frame = cell.bounds;
        [contentView setNeedsDisplay];
    }
    else {

        contentView = [[JTimelineCellContentView alloc] initWithFrame:cell.bounds];


        [self.cellContentCache setObject:contentView forKey:entry.entryID];

        contentView.time = [NSDate timeStringForTime:entry.creationDate];

        contentView.message = entry.message;

        [cell setNeedsDisplay];
}

    [cell.entryView removeFromSuperview];
    cell.entryView = contentView;

    [cell addSubview:cell.entryView];

    return cell;
}

2 个答案:

答案 0 :(得分:2)

我相信你在不同的问题上贴了类似的东西。您无法缓存单元格的contentView。您可以缓存图像,字符串,数字,值等 - 但最后,当您获得单元格时,您需要检索将显示这些值的元素,然后设置它们的值来执行此操作。因此,您可以缓存图像,字符串,CGRect等 - 然后在被要求填充单元格时,您可以查看缓存,如果有效则获取缓存的值。如果未设置缓存,则需要从头开始创建它们。

每次获得特定部分/行的单元格时,它都不同。它可能有旧值,或者可能是新的。您需要为每个项目设置每个GUI元素。一种方法可以很容易地找到这些元素,每个都有一个唯一的标记,所以你可以使用[cell.contentView viewForTag:xxx]获取项目,然后设置它。

答案 1 :(得分:0)

你是否使用 heightForRowAtIndexPath 方法,如果是,那么在我的情况下增加其高度解决的问题我正在尝试类似的修复,它让我疯狂。