gpt4 book ai didi

ios - UITableView InfiniteScrolling 无需在 Swift 中重新加载 TableView

转载 作者:行者123 更新时间:2023-11-29 05:16:22 24 4
gpt4 key购买 nike

我正在尝试使用 UITableView 中的分页 API 来实现无限滚动。因此,当到达底部单元格并重新加载整个 UITableView 时,我正在更新模型(再次调用 API 并附加结果)。我面临的问题是,重新加载完成后,我在屏幕上看到闪烁,但我只想以平滑的方式在 tableView 中添加更多单元格,而不会出现任何闪烁。这是我为此写的内容:

class FeedViewController: UIViewController {    
@IBOutlet private weak var tableView: UITableView!
private var feed: Feed!

required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
feed = Feed(delegate: self)
}

override func viewDidLoad() {
super.viewDidLoad()
feed.fetch(nextPage: true)
}
}

//MARK: TableView
extension FeedViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return feed.articles.count + 1
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if indexPath.row < feed.articles.count {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "FeedTableViewCell") as? FeedTableViewCell else {
return UITableViewCell()
}
cell.delegate = self
cell.setCell(article: feed.articles[indexPath.row])
return cell
}
else if feed.articles.count > 0 && !feed.hasReachedEnd {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "LoaderTableViewCell") as? LoaderTableViewCell else {
return UITableViewCell()
}
cell.addLoader()
return cell
}
return UITableViewCell()
}
}

extension FeedViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if indexPath.row == feed.articles.count && !feed.hasReachedEnd {
feed.fetch(nextPage: true)
}
}
}

//MARK: API Management
extension FeedViewController: FeedProtocol {
func requestCompletedSuccessfully() {
DispatchQueue.main.async { [weak self] in
self?.loader.stopAnimating()
self?.tableView.reloadData()
}
}

func requestFailedWith(error: NSError?) {}
}

在这里您可能会看到,一旦获取请求完成,我就会使用委托(delegate)重新加载整个 tableView ,但如果可能的话,我需要一些更好的解决方案来避免闪烁。如果需要其他信息,请告诉我。谢谢

最佳答案

您应该做的是调用tableView.reloadRows而不是tableView.reloadData。但为了做到这一点,您需要知道在 requestCompletedSuccessively 执行时,您的 feed 中有多少个新元素。像这样的东西:

let indexPaths = Array(previousFeedCount..<newFeedCount)
.map { IndexPath(row: $0, section: 0) }
tableView.reloadRows(at: indexPaths, with: .automatic)

关于ios - UITableView InfiniteScrolling 无需在 Swift 中重新加载 TableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59149519/

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