由于removeFromSuperview,UITableView不能平滑滚动

时间:2013-01-04 20:59:49

标签: iphone ios uitableview

是什么让UITableView上的滚动变得如此不稳定?在我看来,代码是罪魁祸首。我很难用其他东西替换这个逻辑。

for (UIView *view in cell.contentView.subviews) {
[view removeFromSuperview]; }

这就是我在做的事。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

for (UIView *view in cell.contentView.subviews) {
    [view removeFromSuperview];
}

BGMArticleAbstract *articleAbstract = [self.section.articleAbstracts objectAtIndex:indexPath.row];
[cell.contentView addSubview:[self getHedlineFromArticleAbstract:articleAbstract]];
[cell.contentView addSubview:[self getThumbnailImageFromArticleAbstract:articleAbstract]];
[cell.contentView addSubview:[self getAbstractParaFromArticleAbstract:articleAbstract]];

cell.selectionStyle = UITableViewCellSelectionStyleNone;

return cell; }

我正在做,addSubview到contentview,因为我正在创建一个动态单元格高度。有什么方法可以让这个滚动视图顺利进行吗?谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您应该根据需要设计细胞。向单元格添加标签和您需要的任何内容,然后更改这些已有的子视图的内容 如果需要显示图像,请在单元格中添加UIImageView一次,并仅更改其图像属性。对于文本字段等也是如此。

这样做会使内置缓存无效,因为您会一次又一次地重新生成所有子视图。

为了提高性能,您可以自己绘制单元格。

Apple有一个非常好的示例项目: http://developer.apple.com/library/ios/#samplecode/AdvancedTableViewCells/Introduction/Intro.html

答案 1 :(得分:1)

你是对的,问题是由你如何返回细胞引起的。正确的模式如下......

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

    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];


    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    // see if cell contains our image views.  A reused cell will, but a new cell won't
    UIImageView *imageViewA = (UIImageView *)[cell viewWithTag:32];
    UIImageView *imageViewB = (UIImageView *)[cell viewWithTag:33];
    UIImageView *imageViewC = (UIImageView *)[cell viewWithTag:34];

    if (!imageViewA) {
        // the cell must be new, so create it's image views
        // you should be able to borrow most of this code from your getHeadline/thumbnail/etc methods.
        // the good news is that this relatively expensive code runs only for new
        // cells and there are only a few of those - only enough to fill the visible frame
        imageViewA = [[UIImageView alloc] initWithFrame:CGRectMake(/* frame it here */)];
        [cell.contentView addSubview:imageViewA];
        imageViewA.tag = 32;

        imageViewB = [[UIImageView alloc] initWithFrame:CGRectMake(/* frame it here */)];
        [cell.contentView addSubview:imageViewB];
        imageViewB.tag = 33;

        imageViewC = [[UIImageView alloc] initWithFrame:CGRectMake(/* frame it here */)];
        [cell.contentView addSubview:imageViewC;
        imageViewC.tag = 34;

        // this too, need only be done upon creation
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }

    // now, whether it's a new cell or a reused cell, we have image views 

    BGMArticleAbstract *articleAbstract = [self.section.articleAbstracts objectAtIndex:indexPath.row];

    // change your methods getHeadline... getThumbnail... etc to answer UIImages
    // not UIImageViews, which are setup only for new cells

    imageViewA.image = [self getHedlineFromArticleAbstract:articleAbstract]];
    imageViewB.image = [self getThumbnailImageFromArticleAbstract:articleAbstract]];
    imageViewC.image = [self getAbstractParaFromArticleAbstract:articleAbstract]];

    // as a side note, once you get these methods returning images (more like model objects)
    // rather than image views (view objects) they might be more appropriately placed
    // in the BGMArticleAbstract class rather than the view controller

    return cell;
}