标签导航上的集合视图单元格更改

时间:2014-04-20 10:44:47

标签: ios objective-c

我一直在创建一个收集mysql数据的web服务,并使用AFNetworking将其发送到App,进入NSMutableArray imagesArray

我使用DTCoreText提取图片网址,然后将它们放入collectionView Cell。

问题是当我导航到另一个ViewController并返回一个奇怪的事情发生时。不包含图像的单元格会获得另一个单元格中的图像。

图片说明:

正如您所看到的,我已经制作了if和else语句,因此图像不应该有图像和相机图像?

应用程序打开:

enter image description here

在我导航到另一个viewController并返回到此之后:

enter image description here

我的代码:

- (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];
} 

1 个答案:

答案 0 :(得分:0)

首先,阅读一些关于细胞重用机制的教程。 当您第一次呼叫dequeueReusableCellWithReuseIdentifier时,您将获得新分配的单元格(假设单元格来自故事板或您注册了单元格类并将其分配给标识符"cell")。

当它是新创建的单元格对象时,您可能正确创建所有子视图并将其添加为子视图。 但是当用户向下或向上滚动时,dequeueReusableCellWithReuseIdentifier将返回已经获得其子视图的现有单元格。在这种情况下,您只需刷新其内容即可。 但是你创建了新的标签和图像视图等,只需将它们放在同一个位置,这样它们就可以隐藏(在最好的情况下)之前存在的原始UI元素。 在最好的情况下,这只是某种内存泄漏。

坦率地说,当用户使用标签栏导航回到视图后,当视图出现时,我是否知道是否会再次调用每个可见单元格的cellForItemAtIndexPath。我不这么认为,但不会感到惊讶。

在您真正了解此机制并相应地设计代码之前,会出现奇怪的效果。这就是为什么我建议首先解决这些问题并设计你的cellForItemAtIndexPath以使其符合重用机制。这将解决像你这样的大多数问题。 如果它没有修复它,那么请回复我们一个新的问题和重构的cocde。