gpt4 book ai didi

ios - 如何向 UICollectionView 动态添加新单元格?

转载 作者:行者123 更新时间:2023-11-28 05:40:23 24 4
gpt4 key购买 nike

假设 Collection View (或 TableView )的部分属性中的项目数已设置为 10(即,在一个部分中,有 10 个单元格)并且两个单元格填满了整个 View 。这就是我要实现的:

当用户向上滑动查看第 9 和第 10 个单元格时,我想通过下载相应的单元格信息并将单元格插入 Collection View 来显示她的新单元格(即第 11 和第 12 个单元格)。但是直到用户查看最后一个单元格(第 10 个)并向上滑动;不应下载第 11 和第 12 个单元格的数据,用户不应看到单元格(当下载第 11 和第 12 个单元格时,如果用户再次向上滑动,这次将下载第 13 个和第 14 个单元格,依此类推) .

不知道这个“action”有没有名字,所以没法正确搜索。有没有简单的实现方法?

最佳答案

如果您按照 Aaron 的建议在 google 上搜索“无限滚动 TableView ”或“分页”,您会发现许多在 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)])
})
}
}
}

如果这对任何人有帮助,我将很高兴!

关于ios - 如何向 UICollectionView 动态添加新单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56973969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com