Swift получает данные json и индексирует ошибку вне диапазона

#ios #arrays #json #swift

#iOS #массивы #json #swift

Вопрос:

Мой вопрос прост, но я не смог найти решение. Когда я получаю данные JSON с сервера, я хочу отобразить данные в collectionviewcell, но я получил ошибку index out of range.

Это мой код:

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "SiparislerTumAnasayfa", for: indexPath) as! SiparislerTumAnasayfa
    let url = URL(string: "https://abc/api/SiparislerTumListeler/abc")

    let session = URLSession.shared

    let task = session.dataTask(with: url!) { (data, response, error) in
        if error != nil {
            print(error)
        }
        else
        {
            if data != nil{
                do{
                    let responseJSON = try? JSONSerialization.jsonObject(with: data!, options: [])
                    if let responseJSON = responseJSON as? [String: Any] {
                        self.jsonArray = responseJSON["results"] as? [[String: Any]]

                        DispatchQueue.main.async {

                            let row = self.jsonArray![indexPath.row]
                            if let urunAdi = row["siparis_urun_adi"] as? String {
                                cell.siparisUrunAdi.text = urunAdi
                            }
                        }
                    }
                }
                catch {
                    print(error)

                }
            }
        }
    }
    task.resume()

    return cell
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.jsonArray!.count
}
 

[indexPath.row] вот где я получил ошибку.

Комментарии:

1. Почему вы выполняете вызов API внутри collectionView(_:cellForItemAt:) ?

2. я пробовал в viweDidload (), но не сработало

Ответ №1:

Вам нужно добавить код, который обрабатывает случай, когда indexPath.row значение больше или равно self.jsonArray.count .

Комментарии:

1. вы имеете в виду «numberOfItemsInSection» правильно?

2. Это также важный метод (который вы не показываете), но да, по-видимому, он сообщает представлению коллекции, что в вашем JSON больше ячеек, чем у вас, независимо от того, что у вас есть data .

3. Ой. Это действительно плохо, асинхронно получать и анализировать один и тот же JSON снова и снова при каждом cellForItem вызове. Переместите этот код, например, на ваш viewDidLoad() , чтобы он выполнялся только один раз. Кроме того, изучите Codable , чтобы вы могли избежать JSONSerialization .

4. я сделал, и теперь я неожиданно обнаружил ноль при развертывании необязательного значения ошибка

Ответ №2:

Возможно, количество массивов из api ответов меньше, чем numberOfItemsInSection func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {....}