collectionview在tableview单元格内重复

时间:2017-09-11 07:28:22

标签: ios swift uitableview uicollectionview

我在tablview单元格中使用了一个collectionview,其中collectionview单元格有一个imageview,图像从cellForItemAtIndexPath中的URL数组中显示。我在tableview单元类中调用webservice来获取URL数组。 我的问题是每当我向下或向上滚动tableview时,collectionview单元格都在重复,collectionview的图像会重复。所以如何摆脱这种情况。

我的代码如下 -

webservice的内部响应

let imgList : NSArray = arrReponseDetails.value(forKey: "imageList") as! NSArray
        self.arrImgUrls.removeAll()
        for dict in imgList[0] as! NSArray {
            let dictionary = dict as! NSDictionary
            let strUrl : String = dictionary["url_highRes"] as! String
            let url : URL = URL(string: strUrl)!
            self.arrImgUrls.append(url)
        }
        self.collectionView.reloadData()

cellForItemAtIndexPath内的代码

let cell : CollectionCell =  collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! CollectionCell

let url : URL = self.arrImgUrls[indexPath.row]
cell.imgSticker.sd_setShowActivityIndicatorView(true)
cell.imgSticker.sd_setIndicatorStyle(.gray)
cell.imgSticker.sd_setImage(with: url, placeholderImage: nil)
cell.imgSticker.contentMode = .scaleAspectFit
return cell

4 个答案:

答案 0 :(得分:1)

我对你的问题没有太多了解,但我认为问题在于使用可重复使用的单元缓存图像。

只需在collectionView Cell类(prepareForReuse())中实现CollectionCell方法。

override func prepareForReuse() {
    super.prepareForReuse()
    self.imgSticker = nil
}

prepareForReuse()

的参考

答案 1 :(得分:0)

我不会'在tableView中使用colelctionView,这是一种非常奇怪的方法。我曾经是第一次自己做这件事,这让我陷入困境。考虑使用自定义布局更改collectionView的逻辑...

但是要回答你的问题,最好使用这种方法(看看这个答案)

根据这个答案,在CellForRow中设置imageView方法:

https://stackoverflow.com/a/27712427/5774854

答案 2 :(得分:0)

在设置新内容之前,您需要从单元格视图中清除旧内容,因为在某些情况下可能会遗留一些内容并且报告的问题会发生。

func collectionView(collectionView: UICollectionView, 
      cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    {
        let cell : CollectionCell =  collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! CollectionCell

        cell.imageView.image = nil;  //Remove the image (cache one)
    }

希望这会有所帮助!!

答案 3 :(得分:0)

您好你应该在CollectionCell类上添加以下代码:

- (void)prepareForReuse
{
    [super prepareForReuse];
    [[self imgSticker] setImage:nil];
}

注意:如果您也可以设置占位符图像会更好。