Swift 4: представление коллекции «cellForItemAt» выходит за пределы диапазона - PullRequest
0 голосов
/ 28 января 2019

Я получаю индекс вне диапазона фатальной ошибки.Я пытаюсь реализовать 2 представления коллекции в одной ячейке контроллера табличного представления.Оба имеют разные источники данных.При загрузке данных изображения в ячейку из источника данных во 2-ю ячейку представления коллекции не загружаются данные изображения из-за этой ошибки.Даже когда я выгрузил содержимое BList, в нем есть 5 объектов в паре (ключ, значение). Ошибка возникает в следующей строке

let bannerList = BList[indexPath.row]

Я смотрел на другиепохожие вопросы, но ни один из них не был полезен

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionCell", for: indexPath) as! T_PCollectionViewCell

    if (collectionView === upperBannerCollectionView) {
        if OList.count > 0 {
            let olist2 = OList[indexPath.row]
            cell.load_image(olist2.banner_image)
        }
    } else {
        if BList.count > 0 {
            let blist = BList[indexPath.row]
            cell.load_image(blist.banner_image)
        }
    }
    return cell
}

Вот реализация для numberOfItems для collectionView

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
    {
        if (collectionView === uBCollectionView) {
            return self.OList.count
        } else {
            return self.BList.count
        }
    }

Добавлена ​​отладка печати (BList) с изображением

отладка печати (BList) снимок экрана отладчика

Я не должен выводить такой индекс из-за ошибки диапазона при попытке загрузить данные из источников данных BannerList.

1 Ответ

0 голосов
/ 29 января 2019

Прежде всего, я думаю, что ваша главная проблема - это массив внутри вас "numberOfItemsInSection".

позволяет предположить, что вы используете OtokuList.count в " numberOfItemsInSection", и у OtokuList на данный момент есть 3 элемента, но у BannerList есть только один элемент.

 if BannerList.count > 0 { //this validation will work even if indexPath.row is 2
       let bannerList = BannerList[indexPath.row] //this line will crash
       cell.load_image(bannerList.banner_image)
  }

Мое решение для этого:

if BannerList.count > indexPath.row {
      let bannerList = BannerList[indexPath.row]
      cell.load_image(bannerList.banner_image)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...