3

我是 iOS 应用程序开发的新手。我正在为UICollectionView. 图像正在显示,但是当我滚动时UICollectionView,图像会改变它们的位置,并且会出现重复的图像,其中所有图像都应该是唯一的。这是我的代码:

- (MyCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{

    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath];

    cell.imageview_collectnvw.layer.cornerRadius=6.0f;
    cell.imageview_collectnvw.layer.masksToBounds=YES;

    dispatch_queue_t queue = dispatch_queue_create("patientlist",NULL);
    dispatch_async(queue, ^{


        NSString *str=[[[search_array objectAtIndex:indexPath.row]valueForKey:@"friend"]valueForKey:@"linkedin_photo"];

        NSLog(@"cell index path --- is %d",indexPath.row);

        NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:str]];
        dispatch_sync(dispatch_get_main_queue(), ^{

            if ([[collectionView indexPathsForVisibleItems] containsObject:indexPath]) {

                MyCell *cell = (MyCell*)[collectionView cellForItemAtIndexPath:indexPath];

                cell.imageview_collectnvw.image=[UIImage imageWithData:data];

            }

            [cell setNeedsLayout];

            NSLog(@"cell index path main is %d",indexPath.row);

        });
    });


    return cell;
}

这可能是一个愚蠢的问题,但我需要答案。如果有人能回答这个问题,那将有很大帮助。提前致谢。

4

4 回答 4

5

UICollectionView您合作时,应使用indexPath.item而不是indexPath.row.

于 2013-07-25T16:12:52.153 回答
3

在 aUICollectionView或 aUITableView中,单元格被重复使用,这就是您在调用的行中得到的dequeueReusableCellWithReuseIdentifier。因此,您会得到一个较旧的单元格,该单元格开始分配有图像,并且在调用异步调用之前没有将其显式设置为 nil,在下载并设置新图像之前,它仍将具有旧图像。因此,解决方法是分配cell.imageview_collectnvw.image给 nil 或占位符图像,直到下载成功。此外,管理一个缓存在内存中的数组,UIImages并根据需要从内存中删除以获得更好的性能。看看SDWebImage哪个缓存到内存和磁盘中,并且在我所见的情况下具有出色的性能。了解如何在表格中设置图像加载或UICollectionView查看 Apple 的延迟加载示例是一个很好的开始。

于 2013-11-13T07:29:52.220 回答
0

您可以使用SDWebImage进行延迟加载。它将异步加载图像然后缓存图像,无需一次又一次地加载它

于 2013-07-25T16:20:09.677 回答
0

您必须使用多个部分和行。但是您仅使用 indexPath.row 加载图像,这可能会因不同部分而重复。因此,您的部分图像应该是重复的。请确保您的密钥是使用部分和项目生成的。

对于斯威夫特

func getCachedIndexKey(index:NSIndexPath) -> String {
    return "section:\(index.section)item:\(index.item)"
}

此方法将返回一个唯一键(虽然是字符串)。请了解情况并准备好自己的唯一索引键(整数)。

于 2016-09-20T12:42:51.567 回答