Как добавить кнопку / UICollectionViewCell по умолчанию в IndexPath 0 без получения «Фатальная ошибка: индекс выходит за пределы диапазона» - PullRequest
0 голосов
/ 29 июня 2018

Я пытаюсь добавить ячейку по умолчанию для использования в качестве кнопки «Добавить новый» в моем методе cellForItemAt, в то же время возвращая правильное количество элементов в моем представлении коллекции, однако методы, которые я попробовал, либо возвращают неправильное число предметов или вызвать сбой Индекс вне диапазона

Я пытаюсь добиться этого.

enter image description here

Это мой метод numberOfItemsInSection.

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if collectionView == newsCollectionView {
        if newsArticles.count > 0 {
            return newsArticles.count + 1
        } else if newsArticles.count == 0 {
            return 1
        }
    }

    return 0
}

Это мой метод cellForItemAt

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if collectionView == newsCollectionView {
        if indexPath.row == 0 {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "newsDefaultCell", for: indexPath) as UICollectionViewCell

            return cell
        } else {
            let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "newsArticleCell", for: indexPath) as! newsArticleCell

            cell.news = newsArticles[indexPath.row + 1]

            return cell
        }
    }

    return UICollectionViewCell()
}

Я знаю, что эта строка вызывает сбой

return newsArticles.count + 1

Я просто ищу альтернативный способ сделать это, не возвращая на 1 единицу меньше, чем я должен, любая помощь очень ценится.

1 Ответ

0 голосов
/ 29 июня 2018

Вы добавляете, когда вы должны вычесть.

Заменить эту строку:

cell.news = newsArticles[indexPath.row + 1]

с:

cell.news = newsArticles[indexPath.row - 1]

Потому что, когда indexPath.row равен 1, вам нужен первый элемент из вашего массива (т. Е. Элемент с индексом 0).


Кроме того, вы можете просто набрать numberOfItemsInSection, заметив, что если newsArticles.count равно 0, то newsArticles.count + 1 будет 1, так что нет особой причины для этого.

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    if collectionView === newsCollectionView {
        return newsArticles.count + 1
    }

    return 0
}

Примечание : используйте === вместо ==, чтобы проверить, что два элемента являются ссылками на один и тот же объект.

...