防止 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 方法有关,但我不确定该放什么来清理单元格。除了 snapImageView
和 authorAvatarImageView
这两个 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的主要内容,如果未能解决你的问题,请参考以下文章