0

我有以下问题:

我有一个带有一些文本和一些图像作为内容的 UITableView。单元格的 TextLabel 显示文本,我将带有一些 UIImageViews 的 UIView 作为其子视图添加到单元格内容视图。

一切正常,直到我删除一些单元格。发生的情况是,我从表中删除了一个单元格(比如说第一个),重新加载它的数据,然后第二个单元格再向上移动一个,但是!右侧的 UIView 包含来自第一个(已删除)单元格的内容。

我不知道为什么会发生这种情况——尽管我认为 cellForRowAtIndexPath 回调方法有问题。

我将粘贴一些代码以使其更清晰。

我能做的是卸载控制器并再次加载它 - 然后图像再次包含正确的内容......

这是我的代码:

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



static NSString *MyIdentifierUNCHECK = @"MyIdentifierUNCHECK";


MyStuff *m = [allObjects objectAtIndex:indexPath.row];
UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:MyIdentifierUNCHECK];
    UIView *v;    
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
        v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

        v.contentMode = UIViewContentModeScaleAspectFill;
        [v addSubview:[[UIImageView alloc] init]];//some image view
        [cell.contentView addSubview:v];
    }

    cell.textLabel.text = m.name;
    cell.textLabel.numberOfLines = 0;
    cell.textLabel.font = [UIFont fontWithName:@"Helvetica-BoldOblique" size:14.0];
    cell.imageView.image = [UIImage imageNamed:@"checkbox.png"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
4

2 回答 2

2

我假设“右侧视图”是指您在此处为您的单元格实例化的视图...这里出现的问题是因为您重用单元格并且没有为每个单元格重置 UIView,如果您会看到同样的问题发生您有足够的单元格可以滚动浏览它们。当您重用单元格时,您必须始终假设它们有脏数据,并且应该用正确的数据重新加载它们,在您的情况下,您的错误在于以下代码段:

if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifierUNCHECK] autorelease];
    v = [[[UIView alloc] initWithFrame:CGRectMake(5.0, 5.0, 70.0, 70.0)] autorelease];

    v.contentMode = UIViewContentModeScaleAspectFill;
    [v addSubview:[[UIImageView alloc] init]];//some image view
    [cell.contentView addSubview:v];
}

您只是在第一次分配单元格时实例化视图,所以这是正在发生的事情...... 1-您最初制作所有单元格并制作它们的“正确视图” 2-您删除一个单元格 3-对于您的第二个单元格,系统正在重用您作为第一个单元格创建的 UITableViewCell 4-由于单元格不是 nil,因此未设置 UIView,您看到的是第二个单元格的第一个单元格 UIView

由于您没有重置单元格 UIView,因此您在单元格中看到了错误的视图,而不是您期望的视图。

为了解决这个问题,您可以选择不重用单元格,或者您可以移动添加 UIView 的代码以在每次调用 cellForRowAtIndexPath 时发生,这样正确的 UIView 将与正确的单元格一起加载

于 2010-10-12T14:41:28.227 回答
0

我(幸运的是:))想通了-我应该从我的单元格内容中获取已经存在的视图.....并交换其内容。这就是为什么我把它放在第一位的原因......这帮助了我:

    v = [cell.contentView viewWithTag:PRICE_TAG];
    for (UIView *t in v.subviews) {
        [t removeFromSuperview];
    }
    [v addSubview:[self setupPrice:m.price]];

应该阅读更多文档....

于 2010-10-12T14:40:38.103 回答