TableView的无限滚动分页

速爱

使用这个 json 似乎我不能做一个简单的 append 数组,因为分页只适用于页数。如何为页面添加无限滚动/分页?现在第 1 页加载了 20 个项目,它可以工作,但是如何加载其他页面并保留以前加载的页面?

现在我的 VC 看起来像这样:

import UIKit

struct SwiftData: Codable {  
    let results: [Results]
}

struct Results: Codable {
    let title: String?
}


class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    var popularMoviesArray = [Results]()

    var tableViewCell = TableViewCell()

    @IBOutlet weak var tableView: UITableView!
    

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        
        swiftManager.fetchUrl()
        
    }
    
    
    
    func numberOfSections(in tableView: UITableView) -> Int {
       return 1
    }
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return popularMoviesArray.count
    }
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: ConstantFile.cellIdentifier, for: indexPath) as! TableViewCell
        
               
        var item: Results
        item = popularMoviesArray[indexPath.row]

        cell.labelTitle.text = item.title

        return cell
        
    }
    
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        
      performSegue(withIdentifier: ConstantFile.performSegueIdentifier, sender: indexPath.row)
      tableView.deselectRow(at: indexPath, animated: true)
        
    }
    
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        
     guard segue.identifier != nil else {
            return
        }
        
       let letRow = sender as? Int
        
        switch segue.identifier {
        
        case "goToDetail":
            (segue.destination as! ViewControllerDetail).itemDetail = popularMoviesArray[letRow!]
            
        default:
         return

        }

    }
    

}




struct SwiftManager {
    
   let baseURL = "https://api.themoviedb.org/3/movie/popular"
    let apiKey = “xxxxxxxxxxxxxx”
    let filterURL1 = "language=en-US"
    let filterURL2 = "sort_by=popularity.desc"
    let filterURL3 = "page=1"
    
    func fetchUrl() { 
    let urlString = "\(baseURL)?api_key=\(apiKey)&\(filterURL1)&\(filterURL2)&\(filterURL3)"
     performRequest(with: urlString)
    }
    
    func performRequest(with urlString: String) {
            
     if let url = URL(string: urlString) {
                
     let session = URLSession(configuration: .default)
                
     let task = session.dataTask(with: url) { (data, response, error) in
      
    if error != nil {
     self.delegate?.didFailWithError(error: error!)
      return
       }
                    
      if let safeData = data {
       if let movies = self.parseJSON(safeData) {
        self.delegate?.didUpdateStruct(self, swiftData: movies)
        }
                        
         }
                    
           }
                
           task.resume()
                
            }
            
        }
        
        
    func parseJSON(_ swiftData: Data) -> SwiftData? {

     let decoder = JSONDecoder()

      do {
       let decodedData = try decoder.decode(SwiftData.self, from: swiftData)
          return decodedData
           } catch {
               print(error)
               return nil  
                }
                
            }
        

    
}
赫萨姆·马赫迪亚巴迪

您可以看到您已经使用协议中的willDisplay功能到达了列表的底部UITableViewDelegate像下面的代码:

public func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forItemAt indexPath: IndexPath) {
        let lastIndex = self.popularMoviesArray.count - 1
        if indexPath.row == lastIndex {
            // api call and get next page
        }
    }

并且可以调用API获取下一页数据。然后将新数据附加到您的数据源列表并重新加载 tableView:

self.popularMoviesArray.append(contentsOf: newListData)
self.tableView.reloadData()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章