1

セルを再利用する UITable があります。各細胞は、条件に依存したイメージを持っています。正しい画像が常に使用されますが、セルが再利用されると、古い画像が新しい画像の後ろに表示されます。新しいサブビューを追加する前に uiimageview を削除しようとしましたが、効果がありません。

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

    static NSString *simpTableIden = @"simpTableIden";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpTableIden];

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

    }

    NSUInteger row = [indexPath row];

    cell.textLabel.text = [[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"name"];

    CGRect picFrame = CGRectMake(cell.frame.size.width-cell.frame.size.height, 0,   cell.frame.size.height, cell.frame.size.height);

    UIImage *greyDot = [UIImage imageNamed:@"greyDot.png"];
    UIImage *whiteDot = [UIImage imageNamed:@"whiteDot.png"];
    UIImageView *achievImg = [[UIImageView alloc] init];

    tableView.backgroundColor = [UIColor clearColor];

    achievImg.frame=picFrame;

    if ([[[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"achieved"] boolValue]) {

        achievImg.image = whiteDot;
    }
    else {
       achievImg.image = greyDot;
    }

    [achievImg removeFromSuperview];
    [cell.contentView addSubview:achievImg];

    return cell;
 }

どんな助けでも大歓迎ですか?

4

3 に答える 3

3

問題は、cellForRowAtIndexPath:呼び出されるたびに新しいイメージビューを作成することです。次のようにコードを修正しました。

ここでは、新しい新しいセルごとに 1 回 imageView を作成し、呼び出されるたびにそのイメージを置き換えますcellForRowAtIndexPath:

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

  static NSString *simpTableIden = @"simpTableIden";
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpTableIden];
  UIImageView *achievImg = nil;
  if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpTableIden];
    //New Cell ... Create Image view
    achievImg = [[UIImageView alloc] init];
    achievImg.tag = 10;
    [cell.contentView addSubview:achievImg];

  }
  else{
    //Old cell...get previously createdd imageview
    achievImg = (UIImageView*)[cell.contentView viewWithTag:10];
  }
  NSUInteger row = [indexPath row];

  cell.textLabel.text = [[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"name"];

  CGRect picFrame = CGRectMake(cell.frame.size.width-cell.frame.size.height, 0, cell.frame.size.height, cell.frame.size.height);

  UIImage *greyDot = [UIImage imageNamed:@"greyDot.png"];
  UIImage *whiteDot = [UIImage imageNamed:@"whiteDot.png"];


  tableView.backgroundColor = [UIColor clearColor];

  achievImg.frame=picFrame;

  if ([[[self.achievements objectForKey:[keys objectAtIndex:row]] objectForKey:@"achieved"] boolValue]) {

    achievImg.image = whiteDot;
  }
  else {
    achievImg.image = greyDot;
  }

  //You don't need this because it doesn't have a superview in the first place..it's new
  //[achievImg removeFromSuperview];

  return cell;
}
于 2013-05-01T13:28:34.023 に答える
0

常に imageView をセルの contentView に追加しています。セルが再利用されると、セル内に複数の imageViews が発生します。

imageView にタグを付けることができます。セルの contentView に同じタグのビューがあるかどうかを常に確認します。そうでない場合は、imageView を追加します。

UIImageView *achievImg = (UIImageView *)[cell.contentView viewWithTag:55];
if(!achievImg){
    achievImg = [[UIImageView alloc] init];
    achievImg.tag = 55;
    [cell.contentView addSubView:achievImg];
}
于 2013-05-01T13:26:15.590 に答える