防止UIView被重新添加到UITableViewCell

时间:2012-01-06 02:57:04

标签: objective-c ios uitableview uiimageview

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

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

先谢谢。

编辑---

我更新了我的代码以检查子视图是否为nil,然后再次将它们添加为子视图,并且它完美地工作,但每个图像视图中只显示三个图像(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];
    }
}

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您在addSubView方法中使用tableView:cellForIndexPath:

使用故事板,您应该在故事板中创建自定义单元格,这意味着在IB(故事板)中添加您想要的任何内容(例如标签,按钮等)/设计它们并为它们分配标签!< / p>

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;

}

答案 1 :(得分:0)

您是否重新添加了子视图?如果没有,你所看到的只是重复使用的同一个细胞。而不是删除然后重新添加子视图,只需更新子视图内容。