使用这个 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] 删除。
我来说两句