Ios UITableViewCell重用单元格重复值

Ios UITableViewCell重用单元格重复值,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我在重用UITableViewCell时遇到了一个典型的问题。我知道问题是什么,但我不知道我做错了什么,也不知道如何解决。当屏幕第一次呈现时,一切看起来都很棒。但当用户滚动时,相同的图像和文本以8行的形式重复显示 在方法的末尾,我打印出应该显示的文本值。这个值看起来不错,indexPath.row值也不错。我就是不能正确地重复使用电池 我省略了图像刷新代码,因为它有点复杂,并且与主要问题并不相关。请关注文本更新,我相信图像更新也会遵循类似的模式 我认为我设置的电池是正确的。每个子视图仅添加到单元

我在重用
UITableViewCell
时遇到了一个典型的问题。我知道问题是什么,但我不知道我做错了什么,也不知道如何解决。当屏幕第一次呈现时,一切看起来都很棒。但当用户滚动时,相同的图像和文本以8行的形式重复显示

在方法的末尾,我打印出应该显示的文本值。这个值看起来不错,indexPath.row值也不错。我就是不能正确地重复使用电池

我省略了图像刷新代码,因为它有点复杂,并且与主要问题并不相关。请关注文本更新,我相信图像更新也会遵循类似的模式

我认为我设置的电池是正确的。每个子视图仅添加到
单元==nil
块中。然后,我尝试更改此块之外的文本。但不知怎的,它没有得到正确的指针引用???我卡住了

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

    MyObject *obj = [self.fetchedObjects objectAtIndex:indexPath.row];
    UILabel *name;
    UIImageView *imgView;

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

        name = [[UILabel alloc] init];
        name.frame = CGRectMake(40, 0.0, _tableView.frame.size.width-40, 44);
        name.adjustsFontSizeToFitWidth = YES;
        name.minimumScaleFactor = 0.5;
        [cell addSubview:name];

        imgView = [[UIImageView alloc] init];
        imgView.frame = CGRectMake(0, 4, 36, 36);
        imgView.image = [UIImage imageNamed:@"myimage.png"];
        [imgView setContentMode:UIViewContentModeScaleAspectFit];
        [cell addSubview:imgView];
    }

    // this has to be outside the `cell == nil` block, right???        
    name.text = obj.name;

    // this output is perfect - but the actual cells are repeated!
    NSLog(@"indexpath: %d", indexPath.row);
    NSLog(@"name from array: %@", obj.name);

    return cell;
}

如前所述,对于重复使用的单元格,
name
imgView
值将为
nil


您需要在
if
语句中添加
else
,以便通过从单元格访问现有视图来设置
name
imgView

如前所述,对于重复使用的单元格,
name
imgView
的值将为
nil

您需要在
if
语句中添加
else
,通过从单元格访问现有视图来设置
name
imgView

//这必须在
单元格==nil
块之外,对吗?
name.text=obj.name

这是不正确的。当单元格不是nil时,名称标签和图像视图根本不被分配。如果你坚持这样做,确实有一种方法可以解决你的问题(使用视图标签):


但是 我认为您不需要为单元格创建新的标签和图像视图,UITableViewCell提供了
imageView
&
textLabel
。您可以像这样更新它们的值:

if (cell == nil) {
  // ...
}

cell.textLabel.text  = obj.name;
cell.imageView.image = obj.image;

如果要重新显示textLabel&imageView,可以从UITableViewCell创建一个子类inherit,并覆盖
-layoutSubviews

- (void)layoutSubviews
{
  [super layoutSubviews];

  // modify textLabel & imageView's frame
}
//这必须在
单元格==nil
块之外,对吗?
name.text=obj.name

这是不正确的。当单元格不是nil时,名称标签和图像视图根本不被分配。如果你坚持这样做,确实有一种方法可以解决你的问题(使用视图标签):


但是 我认为您不需要为单元格创建新的标签和图像视图,UITableViewCell提供了
imageView
&
textLabel
。您可以像这样更新它们的值:

if (cell == nil) {
  // ...
}

cell.textLabel.text  = obj.name;
cell.imageView.image = obj.image;

如果要重新显示textLabel&imageView,可以从UITableViewCell创建一个子类inherit,并覆盖
-layoutSubviews

- (void)layoutSubviews
{
  [super layoutSubviews];

  // modify textLabel & imageView's frame
}

在f(cell==nil){}下方不在括号内写下你的图像和名称创建和赋值代码。在f(cell==nil){}下方不在括号内写下你的图像和名称创建和赋值代码。很好的解释。在重用时,我可以看到我的引用为零,但我不知道如何获得对它们的引用。多谢各位@Randall很高兴能帮你解决这个问题;)自iOS 6以来,上述模式一直受到积极劝阻。使用单元原型或注册NIB或子类。使用
dequeueReusableCellWithIdentifier:forindexath:
而不是
dequeueReusableCellWithIdentifier:
。我们不再使用晦涩的
标记
值来标识子视图了。@Rob right,这是不鼓励的,这就是为什么我说“如果你坚持这样做”,重点是解释他代码中的错误逻辑。谢谢你的好意:)很好的解释。在重用时,我可以看到我的引用为零,但我不知道如何获得对它们的引用。多谢各位@Randall很高兴能帮你解决这个问题;)自iOS 6以来,上述模式一直受到积极劝阻。使用单元原型或注册NIB或子类。使用
dequeueReusableCellWithIdentifier:forindexath:
而不是
dequeueReusableCellWithIdentifier:
。我们不再使用晦涩的
标记
值来标识子视图了。@Rob right,这是不鼓励的,这就是为什么我说“如果你坚持这样做”,重点是解释他代码中的错误逻辑。谢谢你的好意:)