重用cellViews,而不是清除

时间:2013-03-12 18:58:29

标签: ios uitableview

我注意到我的cellViews没有清除。这意味着,当我向上和向下滚动时,子视图不断添加刚刚重用的cellView ...我做错了什么?

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

    static NSString* cellIdentifier=@"cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

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

    UIImageView cellView = [[UIImageView alloc] initWithFrame:rectCellFrame];

    NSError* error=nil;
    NSData* imageData = [NSData dataWithContentsOfURL:imageArray[indexPath.row] options:NSDataReadingUncached error:&error];

    UIImage* theImage= [UIImage ImageWithData:imageData];

    [cellView setImage:theImage];

    [cell addSubView:cellView];

    .
    .
    .
    .

    [cell addSubView:moreViews];

}

4 个答案:

答案 0 :(得分:1)

如果您要显着修改单元格的内容,我建议创建UITableViewCell的子类并引用它而不是基类。这样,您可以在子类的drawRect方法中进行更新,而不是修改CFRAIP中的UITableViewCell

请注意,您还可以调用单元格的prepareForReuse方法,以便在重复使用单元格之前重置属性。

答案 1 :(得分:1)

dequeueReusableCellWithIdentifier:返回一个单元格(而不是nil)时,它是您之前在tableView:cellForRowAtIndexPath:方法中创建的单元格。您在第一次创建时添加到该单元格的每个子视图仍在其中。如果您从dequeueReusableCellWithIdentifier:获取单元格时添加更多子视图,则单元格中会有额外的子视图。

您的tableView:cellForRowAtIndexPath:方法应具有以下基本结构:

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

        // code here to add subviews to cell.contentView
    }

    // code here to configure those subviews to display the content for indexPath, e.g.
    // set the image of image views and the text of labels.

    return cell;
}

棘手的部分是访问子视图以在dequeueReusableCellWithIdentifier:返回单元格时设置其内容。请查看“Programmatically Adding Subviews to a Cell’s Content View” in the Table View Programming Guide for iOS,其中介绍了如何使用视图标记访问子视图。

答案 2 :(得分:1)

您正在每次方法调用时向单元格添加子视图。这意味着,当一个单元格被重用时,它已经有了旧的子视图。您应该在添加新的之前删除它们。 例如。 [cell.contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

答案 3 :(得分:0)

每次调用- (UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath *)indexPath时,cellViewmoreViews都会再次添加到您已添加这些UIView的单元格中。
当您致电dequeueReusableCellWithIdentifier时,可重复使用的单元格不会删除其子视图。 如果要添加子视图,最佳解决方案是子类UITableViewCell并在子类init

UITableViewCell方法中添加子视图