使用刷新时集合视图索引超出范围

Posted

技术标签:

【中文标题】使用刷新时集合视图索引超出范围【英文标题】:Collection view index out of range when using refresher 【发布时间】:2016-09-24 02:06:37 【问题描述】:

我正在将一组图像加载到CollectionView

当我激活刷新器时,我正在调用这个方法:

func fetchPics()
        //Clear array of post
        pics?.removeAll()

            Common.sharedInstance.fetchPics(completion:  (pics) in
            self.pics = pics
            self.collectionView?.reloadData()
            self.refresher.endRefreshing()
        )
    

视图控制器的viewDidLoad 调用此方法,一切正常;但是,从复习者中调用它会给我一个:

fatal error: Index out of range

错误:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: postCellId, for: indexPath) as! PicCell

        //This is the line that gives me the error
        cell.pic = pics?[(indexPath as NSIndexPath).item]

        return cell
    

在不出现此错误的情况下重新加载集合视图的适当方法是什么?

谢谢

【问题讨论】:

试试cell.pic = pics?[indexPath.row] 看看是否有效 【参考方案1】:

尝试将pics?.removeAll() 也放在完成块内,因为您的闭包代码将稍后执行,如果您的collectionView 可能被调用cellForItemAt indexPath,您将得到空数组。

 func fetchPics()

    Common.sharedInstance.fetchPics(completion:  (pics) in

        pics?.removeAll()
        self.pics = pics
        self.collectionView?.reloadData()
        self.refresher.endRefreshing()
    )

注意:如果您不调用 removeAll,这也将起作用,因为您正在使用新值再次初始化数组。

【讨论】:

我尝试在其中添加它,现在它附加到 pics 数组而不是重新加载它。就像它将内容添加到已经存在的内容中,就好像 remove all 甚至不存在一样。 @NiravD @Walker 我说的是完成块而不是方法fetchPics,所以如果你从完成块中删除pics?.removeAll(),它仍然可以工作我没有告诉你fetchPics 方法再读一遍答案。 我在 20 分钟前发布了答案。感谢您的帮助【参考方案2】:

因为我调用了一个类的共享实例,我在其中进行了数据库调用。在那个类中,我创建了一个 pics 数组的实例,然后我通过完成块在其中返回。

我没有在 fetchPics 方法中调用 pics?.removeAll,所以它每次都附加到它上面。

感谢各位大佬的指导,得出这个答案

【讨论】:

以上是关于使用刷新时集合视图索引超出范围的主要内容,如果未能解决你的问题,请参考以下文章

CollectionView - 致命错误:索引超出范围 - 比视图显示的单元格多

UICollectionView 数组索引超出范围

表视图错误致命错误:加载文件时索引超出范围

来自数组索引的表视图超出范围

在我的表格视图中设置单元格时索引超出范围

当我使用单元格时索引超出范围(Swift)