有一个函数可以更新我的UICollectionView:

@objc func refreshFeed(sender:AnyObject)
{
    fetchWeatherData()
}

private func fetchWeatherData() {
    PostArray = [PostModel]()
    offset = 0
    self.fetchPost()
    self.refreshControl.endRefreshing()
}


此函数使PostArray集合无效,并调用fetchPost功能区更新函数:

    func fetchPost(URL: String){
    ApiService.sharedInstance.fetchPost(url: URL, completion: { (Posts: [PostModel]) in
        self.PostArray.append(contentsOf: Posts)
        self.collectionView.reloadData()
    })
}


更新集合后,函数:

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! PostCell
    cell.PostArray = PostArray[indexPath.item]
    return cell
}


在以下行中给出错误消息:Thread 1: Fatal error: Index out of rangecell.PostArray = PostArray[indexPath.item]

为什么会这样呢?数据属于集合。

对不起我的英语不好

最佳答案

首先,检查func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int是否返回有效的项目数。

比起您可以检查PostArray是否包含给定索引的项目:

如果PostArray.indices〜= indexPath.item {
    cell.postArray = PostArray [indexPath.item]
}


并且您需要确保ApiService.sharedInstance.fetchPost在主队列上运行completion。如果没有,请尝试以下操作:

func fetchPost(URL:String){
    ApiService.sharedInstance.fetchPost(url:URL,完成:{(帖子:[PostModel])在
        self.PostArray.append(contentsOf:帖子)
        DispatchQueue.main.async {
            self.collectionView.reloadData()
        }
    })
}

09-20 20:44