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

时间:2016-09-24 02:06:38

标签: ios arrays swift swift3 collectionview

我正在将一组图片加载到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
    }

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

谢谢

2 个答案:

答案 0 :(得分:2)

尝试将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,那么您也可以使用新值重新初始化数组。

答案 1 :(得分:0)

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

我没有调用fetchPics方法中的struct Menu<'a> { item: Box<Named + 'a> } impl<'a> Menu<'a> { pub fn new(item: Box<Named + 'a>) -> Self { Menu { item: item } } pub fn set<T: Named + 'a>(b: T) -> Self { Menu { item: Box::new(b) } } } ,所以每次都会附加到它。

感谢各位提供导致此答案的指导