单元洞察UICollectionView直到有可见时才加载?

时间:2015-05-28 06:25:56

标签: ios uitableview swift uicollectionview

我有一个UITableView,每个表视图单元都有UICollectionView个洞察力。我使用UICollectionView视图作为图库(带分页的集合视图)。我的逻辑是这样的: 洞察方法

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // This is a dictionary with an index (for the table view row),
    // and an array with the url's of the images
    self.allImagesSlideshow[indexPath.row] = allImages

    // Calling reloadData so all the collection view cells insight
    // this table view cell start downloading there images               
    myCell.collectionView.reloadData() 
}

我致电collectionView.reloadData()并在

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    // This method is called from the cellForRowAtIndexPath of the Table
    // view but only once for the visible cell, not for the all cells,
    // so I cannot start downloading the images


  let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! PhotoCollectionCell

    if self.allImagesSlideshow[collectionView.tag] != nil {

        var arr:[String]? = self.allImagesSlideshow[collectionView.tag]!

        if let arr = arr {

            if indexPath.item < arr.count {

                var imageName:String? = arr[indexPath.item]

                if let imageName = imageName {

                    var escapedAddress:String? = imageName.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())

                    if let escapedAddress = escapedAddress {

                        var url:NSURL? = NSURL(string: escapedAddress)

                        if let url = url {

                            cell.imageOutlet.contentMode = UIViewContentMode.ScaleAspectFill

                            cell.imageOutlet.hnk_setImageFromURL(url, placeholder: UIImage(named: "placeholderImage.png"), format: nil, failure: nil, success: nil)

                        }
                    }
                }
            }
        }
    }

    return cell
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

        if self.allImagesSlideshow[collectionView.tag] != nil {

            var arr:[String]? = self.allImagesSlideshow[collectionView.tag]!

            if let arr = arr {

                 println("collection row: \(collectionView.tag), items:\(arr.count)")

                return arr.count
            }
        }

        return 0
    }

我为细胞设置了正确的图像。问题是仅针对第一个集合视图单元调用上述方法。因此,当用户滑动到下一个集合视图单元格时,再次调用上述方法,但是在下载图像时存在延迟。我希望所有的集合视图单元都能加载洞察每个可见的表格视图单元格,而不仅仅是第一个单元格。

使用我发布的图像,每次加载“集合视图单元格(编号0)”,但仅在用户滑动时才加载“集合视图单元格(编号1)”。我如何强制为集合视图的每个单元格调用上面的方法,而不仅仅是可见的?我想在刷卡用户之前开始下载过程。

谢谢!

enter image description here

1 个答案:

答案 0 :(得分:1)

你是对的。仅当单元格开始出现时才会调用函数func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell。这是苹果的解决方案,叫做“懒加载”。想象你的表/集合视图有数千行,并且所有这些行同时初始化,这对内存和处理器来说都非常糟糕。所以苹果决定初始化只需要显示的视图。

并且对于加载图像,您可以使用一些异步加载器,如

https://github.com/rs/SDWebImage

它也很强大且有用:D