Если вы будете искать в 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)])
})
}
}
}
Я буду рад, если это кому-нибудь поможет!