【问题标题】:refreshing cell content after deleting cells删除单元格后刷新单元格内容
【发布时间】:2010-10-12 22:41:28
【问题描述】:

我有以下问题:

我有一个带有一些文本和一些图像作为内容的 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;

【问题讨论】:

  • 您的模型(所有对象)是否同步,即索引是否匹配?也许也显示删除代码。

标签: iphone uitableview reloaddata


【解决方案1】:

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

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 将与正确的单元格一起加载

【讨论】:

  • 正确!感谢您重新制定,我真的应该更彻底地阅读 api....
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2014-06-07
    • 2018-07-08
    相关资源
    最近更新 更多