2012-01-06 56 views
0

我重构了我的代码以使用最新的iOS 5方法重用UITableViewCell。但是,正在cellForRowAtIndexPath方法中出列的UITableViewCells的子视图将被重新添加到同一个单元的contentView或其他单元中。防止UIView被重新添加到UITableViewCell中

如何防止单元格的子视图跳转到其他单元格并将其自身添加为子视图?

谢谢先进。

编辑---

我更新了我的代码进行检查,看是否有子视图再次将其添加为一个子视图之前为零,它完美的作品,但只有三个图像是不断显示在每个图像视图( avatarImageView和snapImageView)。这是因为if语句只经历了三次。请你能告诉我为什么会发生这种情况吗?

我的控制台看起来是这样的:

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 2012-01-06 03:27:48

+0

谢谢,这肯定与prepareForReuse方法有关,但我不确定要清理细胞的内容。单元格中的所有内容,变量明智地与两个UIImageView,'snapImageView'和'authorAvatarImageView'分开,有什么想法? – 2012-01-06 03:58:17

+0

你可以发布你的'-prepareForReuse'代码吗? – mvds 2012-01-07 15:57:29

回答

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

是子视图被你重新添加?如果不是,你所看到的只是被重用的同一个单元。不要删除然后重新添加子视图,只需更新子视图的内容即可。