像 Instagram 或任何应用程序一样向下滚动时加载

Load while scrolling down like Instagram or any app

我目前有一个 Xcode 项目,它加载数据并将它们放入数组中,这些数组将被排序并放置在 table 上。截至目前,当我转到 viewDidLoad() 部分中的 table 时,我有一个函数可以收集我需要的所有数据。但是为了阻止应用程序崩溃,它加载了 30 个限制。我当前的问题是,一旦用户滚动浏览 30 个项目,我希望在最初的 30 个项目(标准滚动)下再加载 30 个。我能想到的唯一方法是重新加载整个 table 这不是很聪明。

我只想要一个标准的滚动功能,您可以在 Instagram、Facebook 或任何在 table 视图上加载数据的互联网应用程序中看到该功能。所以当用户滚动时,更多的数据被添加到底部。下面我复制了我用来收集初始数据的代码:

    func findAnimalUsers() {
        //STEP 1: Find users
                let animalQuery = PFQuery(className: "Animals") //choosing class
                animalQuery.whereKey("dog", equalTo: animalType.text!) //getting users with animal type user types
                animalQuery.limit = 30 //number of users intitally showing
                animalQuery.findObjectsInBackground (block: { (objects, error) -> Void in
                    if error == nil { //if no error

                        //clean up
                        self.animalArray.removeAll(keepingCapacity: false)

                        //STEP 2: Find related objects depending on query setting
                        for object in objects! {
                            self.animalArray.append(object.value(forKey: "user") as! String) //objectId of related users
                        }

                        //STEP 3: Find users
                        let query = PFUser.query()
                        query?.whereKey("objectId", containedIn: self.animalArray) //finding users
                        query?.addDescendingOrder("createdAt") //how to order users
                        query?.findObjectsInBackground(block: { (objects, error) -> Void in
                            if error == nil {

                                //clean up
                                self.usernameArray.removeAll(keepingCapacity: false)                                                   

                                self.profilePhotoArray.removeAll(keepingCapacity: false)
                                self.objectIDArray.removeAll(keepingCapacity: false)

                                //find related objects depending on query setting
                                for object in objects! {
                                    self.usernameArray.append(object.object(forKey: "username") as! String)
                                    self.profilePhotoArray.append(object.object(forKey: "profilePhoto") as! PFFile)
                                    self.objectIDArray.append(object.objectId!)

                                }
                            } else {
                                print(error)
                            }
                        })
                    } else {
                        print(error)
                    }
                })
            }

我还添加了 table 如何使用此信息的代码:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //define cell
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! AnimalsCell

        //STEP 1: connect data from server to objects
        cell.usernameLabel.text = usernameArray[indexPath.row]
        cell.objectID = objectIDArray[indexPath.row]
        profilePhotoArray[indexPath.row].getDataInBackground (block: { (data, error) in
            if error == nil {
                cell.profilePhoto.image = UIImage(data: data!)                
            } else {
                print(error)
            }            
        })

所以当这个视图控制器在 viewDidLoad() 中出现时,我只需要在其中使用 findAnimalUsers() 来开始初始加载。 如何在向下滚动时加载更多内容???

您可以使用 tableView

的委托方法轻松做到这一点
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell , forRowAtIndexPath indexPath: NSIndexPath) {

    if indexPath.row == lastElement {
        // handle your logic here to get more items, add it to dataSource and reload tableview
    } 
}

可以使用scrollview的delegate方法

func scrollViewDidScroll(_ scrollView: UIScrollView)
{
    let offsetY = scrollView.contentOffset.y
    let contentHeight = scrollView.contentSize.height
    let scrollHeight = scrollView.frame.size.height
    if offsetY >= contentHeight - scrollHeight
    {
        //your logic
    }
}