Как исправить: фатальная ошибка: индекс вне диапазона - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь ограничить мой массив [String] только пятью значениями с помощью swifts .prefix

Сначала я беру исходный массив items и склеиваю его с помощью .prefix

let testSlice = Array(items.prefix(5))
let newArray = Array(testSlice)

Затем я проверил, что массив содержит только пять значений со строкой печати. ​​

print("DEV: newArray value: \(newArray)")

if newArray != [] {
    cell.profilePicture.playPortalProfilePic(forImageId: newArray[indexPath.item], { error in
        if let error = error {
            print("Error requesting profile pic: \(String(describing: error))")
        }
    })
} else {
    print("items array was empty, value: \(items)")
}

Затем newArray передается методу, предоставленному SDK, который я использую для отправки запросов на profilePictures.NewArray содержит эти значения, поэтому здесь [indexPath.item] подходит.Когда он работает правильно, он создает ячейки в представлении коллекции в зависимости от количества значений в массиве.

В настоящее время я вижу Fatal error: Index out of range, когда эта строка пытается выполнить cell.profilePicture.playPortalProfilePic(forImageId: newArray[indexPath.item]

РЕДАКТИРОВАТЬ: Код запрашивается комментариями

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

Полный метод для cell.profilePicture.playPortalProfilePic(forImageId: newArray[indexPath.item] строки

 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell

        cell.profilePicture.layer.masksToBounds = true

        let testSlice = Array(items.prefix(5))
        let newArray = Array(testSlice)

        print("DEV: newArray value: \(newArray)")

        if newArray != [] {
            cell.profilePicture.playPortalProfilePic(forImageId: newArray[indexPath.item], { error in
                if let error = error {
                    print("Error requesting profile pic: \(String(describing: error))")
                }
            }
            )
        } else {
            print("items array was empty, value: \(items)")
        }


        cell.backgroundColor = UIColor.cyan
        cell.layer.borderColor = UIColor.black.cgColor
        cell.layer.borderWidth = 1
        cell.layer.cornerRadius = 8

        return cell
    }

1 Ответ

0 голосов
/ 10 июля 2019

Вы используете items в качестве источника данных в numberOfItemsInSection, в то время как внутри cellForItemAt используется другой newArray с меньшим размером на prefix(5), следовательно, происходит сбой, поэтому вы должны либо вернуть счет newArrray.count внутри numberOfItemsInSectionили используйте testSlice один

...