2012-01-06 9 views
0

最新のiOS 5のUITableViewCellメソッドを使用するようにコードをリファクタリングしました。ただし、cellForRowAtIndexPathメソッドでデキューされているUITableViewCellsのサブビューは、同じセルのcontentViewまたは別のセルに再追加されています。UIViewがUITableViewCellに再追加されないようにする

セルのサブビューが他のセルにジャンプしてサブビューとして追加されないようにするにはどうすればよいですか?

ありがとうございました。

編集---

私はサブビューがサブビューとしてそれらを再度追加する前にゼロであり、それは完璧に動作するかどうかを確認するために私のコードを更新しましたが、唯一の3枚の画像をこれまで(各画像ビューに表示されますavatarImageViewおよびsnapImageView)。これは、if文が3回までしか実行されないためです。なぜこれが起こっているのか教えてください。

2012-01-06 03:25:39.497 App[1347:707] in snap 
2012-01-06 03:25:39.500 App[1347:707] in avatar 
2012-01-06 03:25:39.518 App[1347:707] in snap 
2012-01-06 03:25:39.520 App[1347:707] in avatar 
2012-01-06 03:25:42.593 App[1347:707] in snap 
2012-01-06 03:25:42.595 App[1347:707] in avatar 

更新されたコード::私のコンソールは、このようになります

私が正しくあなたを理解していれば

- (void) setPost:(TBPost *) _post { 

    if (post != _post) { 
     [post release]; 
     post = [_post retain]; 
    } 

    ... 

    if (self.snap == nil) { 

     NSLog(@"in snap"); 

     NSString *str = [[_post snaps] objectForKey:TBImageOriginalURL]; 
     NSURL *url = [NSURL URLWithString:str]; 
     [TBImageDownloader downloadImageAtURL:url completion:^(UIImage *image) { 
      [self setSnap:image]; 
     }]; 

    } 

    if ([self viewWithTag:-25] == nil) { 
     UIImageView *pinView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"pin"]]; 
     NSArray *r = [NSArray arrayWithObjects:@"-5", @"-4", @"-3", @"-2", @"-1", @"0", @"1", @"2", @"3", @"4", @"5", nil]; 
     int place = self.frame.origin.x + (self.frame.size.width/2) - (pinView.frame.size.width/2) + [[r objectAtIndex:rand() % [r count]] intValue]; 
     CGRect frame = [pinView frame]; 
     frame.origin.x = place; 
     frame.origin.y = -5; 
     [pinView setFrame:frame]; 
     [pinView setTag:-25]; 
     [self addSubview:pinView]; 
     [pinView release]; 
    } 

    if (self.authorAvatar == nil) { 

     NSLog(@"in avatar"); 

     NSURL *urls = [[[_post user] avatars] objectForKey:[[TBForrstr sharedForrstr] stringForPhotoSize:TBPhotoSizeSmall]]; 

     [TBImageDownloader downloadImageAtURL:urls completion:^(UIImage *image) { 
      [self setAuthorAvatar:image]; 
     }]; 

     [self.authorAvatarImageView.layer setMasksToBounds:YES]; 
     [self.authorAvatarImageView.layer setCornerRadius:10]; 

    } 

    if ([self viewWithTag:-26] == nil) { 
     UIImageView *iv = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"avatar_overlay"]]; 
     [iv setFrame:[self.authorAvatarImageView frame]]; 
     [iv.layer setMasksToBounds:YES]; 
     [iv.layer setCornerRadius:6^7]; 
     [iv setTag:-26]; 
     [self addSubview:iv]; 
     [iv release]; 
    } 
} 
+0

私はあなたが正確に尋ねていることは分かりませんが、あなたの 'UITableViewCell'サブクラス(あなたが投稿したと仮定して)がセルをクリーンアップする適切な' -prepareForReuse'メソッドを実装するはずです。 – mvds

+0

ありがとう、それは間違いなくprepareForReuseメソッドとは関係ありませんが、セルを整理するために何を入れるべきかはわかりません。セル内のすべての変数は、2つのUIImageView、 'snapImageView'と' authorAvatarImageView'とは別に変更されています。 –

+0

'-prepareForReuse'コードを投稿することができますか? – mvds

答えて

1

、あなたのtableView:cellForIndexPath:方法でaddSubViewを使用しています。

ストーリーボードを使用して、/あなたが(例えばラベル、ボタンなど)を好きな追加設計してIB(ストーリーボード)で、それらにタグを割り当てる意味、ストーリーボードにカスタムセルを作成する必要があります! tableView:cellForIndexPath:方法、それらを参照する

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

{ 
UITableViewCell *cell = [tableView dequeue....:@"cellID"]; 
UILabel *label = (UILabel *)[cell.contentView viewWithTag:1001]; 
label.text = @"...."; 

UIButton *button = (UIButton *)[cell.contentView viewWithTag:1002]; 
// etc. 

return cell; 

} 
0

はあなたによって再追加されたサブビューはありますか?そうでない場合は、再利用されているセルと同じセルが表示されます。サブビューを削除してから再追加するのではなく、サブビューの内容を更新するだけです。

関連する問題