我一直在创建一个收集mysql数据的web服务,并使用AFNetworking将其发送到App,进入NSMutableArray imagesArray
我使用DTCoreText提取图片网址,然后将它们放入collectionView Cell。
问题是当我导航到另一个ViewController并返回一个奇怪的事情发生时。不包含图像的单元格会获得另一个单元格中的图像。
图片说明:
正如您所看到的,我已经制作了if和else语句,因此图像不应该有图像和相机图像?
应用程序打开:
在我导航到另一个viewController并返回到此之后:
我的代码:
- (UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
collectionCell *cell = [cv dequeueReusableCellWithReuseIdentifier:@"cell" forIndexPath:indexPath];
UIColor * borderColor = [UIColor colorWithRed:226/255.0f green:221/255.0f blue:219/255.0f alpha:1.0f];
cell.backgroundColor = [UIColor lightGrayColor];
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenWidth = screenRect.size.width;
cell.self.theView = [[UIView alloc] initWithFrame:CGRectMake(0, 200-50, screenWidth/2-8, 50)];
cell.self.theView .backgroundColor = [UIColor whiteColor];
[cell.contentView addSubview:cell.self.theView];
cell.self.theTitle = [[UILabel alloc] initWithFrame:CGRectMake(5, 0, screenWidth/2-8-5, 30)];
cell.self.theTitle.textColor = tintColor;
[cell.self.theTitle setFont:[UIFont fontWithName:@"HelveticaNeue-Medium" size:12]];
cell.self.theTitle.text = [[imagesArray valueForKey:@"title"] objectAtIndex:indexPath.row];
[cell.self.theView addSubview: cell.self.theTitle];
UIView *bottomLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.self.theView.frame.size.height-2, cell.self.theView.frame.size.width, 2)];
bottomLineView.backgroundColor = borderColor;
[cell.self.theView addSubview:bottomLineView];
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
NSArray* matches = [detector matchesInString:[[imagesArray valueForKey:@"content"] objectAtIndex:indexPath.row] options:0 range:NSMakeRange(0, [[[imagesArray valueForKey:@"content"] objectAtIndex:indexPath.row] length])];
NSArray *imageExtensions = @[@"png", @"jpg", @"gif", @"jpeg"];
Images = [[NSMutableArray alloc] init];
// Iterate & match the URL objects from your checking results
for (NSTextCheckingResult *result in matches) {
NSURL *url = [result URL];
NSString *extension = [url pathExtension];
if ([imageExtensions containsObject:extension]) {
NSLog(@"Image URL: %@", url);
[Images addObject:url];
} else {
}
}
if(Images.count > 0)
{
cell.self.theImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, screenWidth/2-8, 150)];
UIImage* myImage = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString: [NSString stringWithFormat:@"%@",[Images objectAtIndex:0] ]]]];
[cell.self.theImage setImage:myImage];
[cell.contentView addSubview:cell.self.theImage];
} else {
cell.self.theImage = [[UIImageView alloc] initWithFrame:CGRectMake((screenWidth/2-8-5)/2-25, 80-25, 50, 50)];
UIImage* myImage = [UIImage imageNamed:@"camera"];
[cell.self.theImage setImage:myImage];
[cell.contentView addSubview:cell.self.theImage];
}
return cell;
}
viewWillAppear中
-(void)viewWillAppear:(BOOL)animated {
imagesArray = [[NSMutableArray alloc] init];
[imagesArray removeAllObjects];
[self getImages];
}
答案 0 :(得分:0)
首先,阅读一些关于细胞重用机制的教程。
当您第一次呼叫dequeueReusableCellWithReuseIdentifier
时,您将获得新分配的单元格(假设单元格来自故事板或您注册了单元格类并将其分配给标识符"cell"
)。
当它是新创建的单元格对象时,您可能正确创建所有子视图并将其添加为子视图。
但是当用户向下或向上滚动时,dequeueReusableCellWithReuseIdentifier
将返回已经获得其子视图的现有单元格。在这种情况下,您只需刷新其内容即可。
但是你创建了新的标签和图像视图等,只需将它们放在同一个位置,这样它们就可以隐藏(在最好的情况下)之前存在的原始UI元素。
在最好的情况下,这只是某种内存泄漏。
坦率地说,当用户使用标签栏导航回到视图后,当视图出现时,我是否知道是否会再次调用每个可见单元格的cellForItemAtIndexPath。我不这么认为,但不会感到惊讶。
在您真正了解此机制并相应地设计代码之前,会出现奇怪的效果。这就是为什么我建议首先解决这些问题并设计你的cellForItemAtIndexPath
以使其符合重用机制。这将解决像你这样的大多数问题。
如果它没有修复它,那么请回复我们一个新的问题和重构的cocde。