UICollectionView не создает новую ячейку, если ячейка отображается с помощью (indexPath.item% n == 0).Это не создает новую ячейку для кратных числа - PullRequest
0 голосов
/ 25 марта 2019

Я использую это условие для создания определенных UICollectionViewCells.

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if(indexPath.item % 3 == 0){//multiples of 3
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "Cell1id", for: indexPath) as! Cell1
        cell.backgroundColor = .white

        if(cell.wasCreated){
            cell.cellLabel.text = "Cell(1) \(indexPath.item) was created before."
        }
        else{
            cell.cellLabel.text = "Creating cell(1) \(indexPath.item) first time."
            cell.wasCreated = true
        }

        return cell
    }
    else{
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "Cell2id", for: indexPath) as! Cell2
        cell.backgroundColor = .gray

        if(cell.wasCreated){
            cell.cellLabel.text = "Cell(2) \(indexPath.item) was created before."
        }
        else{
            cell.cellLabel.text = "Creating cell(2) \(indexPath.item) first time."
            cell.wasCreated = true
        }

        return cell
    }
}//end cellForItemAt

Здесь 'wasCreated' - это переменная внутри ячейки, которую я использую, чтобы проверить, создается ли ячейка в первый раз, если я установил wasCreated = true, и это должно быть сделано, в первый раз, для каждой клетки, но это не так. Условие таково: если indexPath.item кратно 3, deque ячейка 1, иначе ячейка 2. Теперь обычно, когда ячейка должна отображаться в первый раз, вызывается метод ячейки init (), но в этом случае он не вызывается и по какой-то причине запрашивается более старая ячейка. Я понятия не имею, почему это происходит.

Я загрузил пример проекта, который воспроизводит проблему. Вот ссылка: https://github.com/AfnanAhmadiOSDev/IndexMultiplesTest.git

1 Ответ

4 голосов
/ 25 марта 2019

Ожидаемое вами поведение. Чтобы уменьшить использование памяти, ячейки повторно используются в качестве прокрутки представления коллекции.

При вызове dequeueReusableCell UIKit проверяет, есть ли ячейка с запрошенным идентификатором, которая переместилась за пределы экрана и, следовательно, имеет право на повторное использование. Если есть, то эта ячейка возвращается. В этом случае init не будет вызываться. Если ячейка-кандидат отсутствует, возвращается новый экземпляр ячейки и вызывается init.

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

Повторное использование ячейки не зависит от IndexPath, для которого ячейка использовалась ранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...