#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 {....}