我重构了我的代码以使用最新的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];
}
}
我不确定你在问什么,但听起来像你的'UITableViewCell'子类(假设你已发布的)应该实现一个适当的清理单元格的“-prepareForReuse”方法。 – mvds 2012-01-06 03:27:48
谢谢,这肯定与prepareForReuse方法有关,但我不确定要清理细胞的内容。单元格中的所有内容,变量明智地与两个UIImageView,'snapImageView'和'authorAvatarImageView'分开,有什么想法? – 2012-01-06 03:58:17
你可以发布你的'-prepareForReuse'代码吗? – mvds 2012-01-07 15:57:29