Как динамически добавлять новые ячейки в UICollectionView? - PullRequest
1 голос
/ 10 июля 2019

Допустим, в представлении коллекции (или табличном представлении) количество элементов в свойстве раздела было установлено равным 10 (т. Е. В разделе имеется 10 ячеек), и две ячейки заполняют весь вид.Это то, что я хочу реализовать:

Пока пользователь просматривает 9-ю и 10-ю ячейки, если она проводит, я хочу показать ее новые ячейки (т.е. 11-ю и 12-ю ячейки), загрузив соответствующую информацию о ячейке и вставивячейки для представления коллекции.Но пока пользователь не просмотрит последнюю ячейку (десятую) и не проведет вверх;Данные 11-й и 12-й ячеек не должны загружаться, и пользователь не должен видеть ячейки (а при загрузке 11-й и 12-й ячеек, если пользователи снова проведут вверх, на этот раз будут загружены 13-я и 14-я ячейки и т. Д.).

Я не знаю, есть ли название для этого "действия", поэтому я не смог найти его соответствующим образом.Есть ли простой способ реализовать это?

1 Ответ

1 голос
/ 11 июля 2019

Если вы будете искать в Google «бесконечно прокручиваемый вид таблицы», как предложил Аарон, или «нумерацию страниц», вы найдете множество более хороших и более сложных руководств по его реализации в iOS.Но мне нужно что-то простое и «просто работает», поэтому вот как я реализовал:

Сначала я определю пять переменных:

let objectsToShowPerUpdate = 5 // I display 5 objects in the collection view, if user scroll down another 5 objects will be download and so on.

var objectIDs = [String]() // These are the IDs for to download objects to be viewed in collection views

var previouslyViewedCellIndexPaths = [Int]() // This will be explained below.
let objectNumberToBeDownloadedTotal = 10 // So I will download 10 objects in this case - I will first download 5 and if user scrolls down will download 5 more.

var objectsArray = [Object]() // will store Object items in this array.

В viewDidLoad () я скачаюи покажите первые 5 объектов (как установлено objectsToShowPerUpdate).

downloadObjectIDsFunction { (downloadedObjectIDs) in
    self.objectIDs = downloadedObjectIDs

    downloadedObjectIDs.forEach({ (objectID) in
        downloadObject(objectID: objectID, { (object) in
            if self.objectsArray.count > self.objectsToShowPerUpdate - 1 { return }
            self.objectsArray.append(object)
            self.yourCollectionView.insertItems(at: [IndexPath(row: self.objectsArray.count - 1, section: 0)])
})
})

Установите, сколько элементов будет содержать ваша коллекция:

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

Установите, как будут отображаться ваши ячейки:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: yourIdentifier, for: indexPath) as! YourCustomCell
    cell.titleLabel.text = objectsArray[indexPath.row].title
    return cell
}

Выполните нумерацию страниц здесь:

func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if (indexPath.row + 1) % objectsToShowPerUpdate == 0 && indexPath.row + 1 < objectIDs.count && !previouslyViewedCellIndexPaths.contains(indexPath.row + 1) && indexPath.row + 1 < objectNumberToBeDownloadedTotal {

        previouslyViewedCellIndexPaths.append(indexPath.row + 1) // So if user viewed the last cell before, we won't download same objects again.

        let indexes = (indexPath.row + 1)...(indexPath.row + objectsToShowPerUpdate)
        indexes.forEach { (index) in
            downloadObject(objectID: objectIDs[index], { (object) in
                self.objectsArray.append(object)
                self.yourCollectionView.insertItems(at: [IndexPath(row: self.objectsArray.count - 1, section: 0)])
            })
        }
    }
}

Я буду рад, если это кому-нибудь поможет!

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