防止 UIView 被重新添加到 UITableViewCell

Posted

技术标签:

【中文标题】防止 UIView 被重新添加到 UITableViewCell【英文标题】:Prevent UIView's from being re-added to a UITableViewCell 【发布时间】:2012-01-06 02:57:04 【问题描述】:

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

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

提前致谢。

编辑---

我更新了我的代码以检查子视图是否为 nil,然后再次将它们添加为子视图,并且它运行良好,但每个图像视图(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];
    

【问题讨论】:

我不确定你到底在问什么,但听起来你的 UITableViewCell 子类(假设这是你发布的)应该实现一个正确的 -prepareForReuse 方法来清理细胞。 谢谢,这肯定与 prepareForReuse 方法有关,但我不确定该放什么来清理单元格。除了 snapImageViewauthorAvatarImageView 这两个 UIImageViews 之外,单元格中的所有内容都发生了变化,有什么想法吗? 你能把你的-prepareForReuse代码贴出来吗? 【参考方案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;


【讨论】:

【参考方案2】:

您是否正在重新添加子视图?如果没有,您所看到的只是被重复使用的同一个单元格。无需删除然后重新添加子视图,只需更新子视图的内容即可。

【讨论】:

以上是关于防止 UIView 被重新添加到 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

如何防止 UIView.animate 被调用

需要帮助创建复杂的 UIView - Swift xCode [关闭]

在 UIView 中重新加载 JSON 提要

UIView 未自动释放。我的问题在哪里?

IOS - 如何防止后台按钮被点击?

更改 UITableViewCell 内的 UIView 高度