删除单元格后刷新单元格内容

时间:2010-10-12 14:28:16

标签: iphone uitableview reloaddata

我有以下问题:

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

2 个答案:

答案 0 :(得分: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-由于单元格没有,UIView没有被设置,你看到的是第二个单元格的第一个单元格UIView

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

为了解决这个问题,您可以选择不重复使用单元格,也可以在每次调用cellForRowAtIndexPath时移动添加UIView的代码,这样右侧UIView将加载正确的单元格

答案 1 :(得分:0)

我(幸运的是:))想出来了 - 我应该从我的单元格内容中获取已经存在的视图.....并交换其内容。这就是为什么我在第一时间标记它....这帮助了我:

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

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