UITableView load more when scrolling to bottom like Facebook application

后端 未结 18 2133

I am developing an application that uses SQLite. I want to show a list of users (UITableView) using a paginating mechanism. Could any one please tell me how to load more dat

18条回答
  •  北海茫月
    2020-11-27 09:49

    For Xcode 10.1, Swift 4.2

    This video seems like a great tutorial!

    Starter/Complete project: https://github.com/RobCanton/Swift-Infinite-Scrolling-Example

    import UIKit
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
        var tableView:UITableView!
    
        var fetchingMore = false
        var items = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view, typically from a nib.
            initTableView()
        }
    
        func initTableView() {
            tableView = UITableView(frame: view.bounds, style: .plain)
            tableView.register(UITableViewCell.self, forCellReuseIdentifier: "tableCell")
            tableView.delegate = self
            tableView.dataSource = self
    
            view.addSubview(tableView)
            tableView.translatesAutoresizingMaskIntoConstraints = false
    
            let layoutGuide = view.safeAreaLayoutGuide
            tableView.leadingAnchor.constraint(equalTo: layoutGuide.leadingAnchor).isActive = true
            tableView.topAnchor.constraint(equalTo: layoutGuide.topAnchor).isActive = true
            tableView.trailingAnchor.constraint(equalTo: layoutGuide.trailingAnchor).isActive = true
            tableView.bottomAnchor.constraint(equalTo: layoutGuide.bottomAnchor).isActive = true
    
            tableView.reloadData()
        }
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return items.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
                let cell = tableView.dequeueReusableCell(withIdentifier: "tableCell", for: indexPath)
                cell.textLabel?.text = "Item \(items[indexPath.row])"
                return cell
        }
    
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            let offsetY = scrollView.contentOffset.y
            let contentHeight = scrollView.contentSize.height
    
            if offsetY > contentHeight - scrollView.frame.height * 4 {
                if !fetchingMore {
                    beginBatchFetch()
                }
            }
        }
    
        func beginBatchFetch() {
            fetchingMore = true
            print("Call API here..")
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.50, execute: {
                print("Consider this as API response.")
                let newItems = (self.items.count...self.items.count + 12).map { index in index }
                self.items.append(contentsOf: newItems)
                self.fetchingMore = false
                self.tableView.reloadData()
            })
        }
    }
    

提交回复
热议问题