我正在将一组图片加载到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
}
在不收到此错误的情况下重新加载集合视图的适当方法是什么?
谢谢
答案 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) }
}
}
,所以每次都会附加到它。
感谢各位提供导致此答案的指导