【问题标题】:Load while scrolling down like Instagram or any app像 Instagram 或任何应用程序一样向下滚动时加载
【发布时间】:2017-10-17 12:17:51
【问题描述】:

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

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

    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)
                    }
                })
            }

我还添加了表格如何使用这些信息的代码:

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() 来启动初始加载。 向下滚动时如何加载更多内容???

【问题讨论】:

标签: ios swift parse-server


【解决方案1】:

你可以使用scrollview的委托方法

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
    }
}

【讨论】:

  • 我尝试使用它,在我的逻辑中,我让它通过数组中的项目数跳过查询,该数组决定表中应该有多少行。但是当我开始滚动时,它会加载多个重复项。 animalQuery.skip = objectIDArray.count我该如何解决这个问题???
  • @fphelp 在您的情况下 objectId 应该是唯一的,因此当您滚动时,您的最后一个 objectId 将是您接下来 30 个获取数据的第一个;就像如果您现在最后一个 objectId 是 30,那么在您的下一个滚动中,您将从 objectId 31 加载数据,然后您将在数组中附加数据并在附加数据后重新加载表,这样您就不会得到重复的数据..
  • 嗯。我不确定我是否理解你完全想说的话。要获取表中所需的行数,它会计算数组objectIDArray.count 中的对象。 我不应该让我用来填充行数的同一数组跳过代码吗?
  • 我想说的是,将数组的最后计数存储在整数变量中,因此当您再次滚动时,您将使用存储的变量计数开始加载下一个数据..
  • 我仍然收到重复文件,我该如何解决?
【解决方案2】:

您可以使用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
    } 
}

【讨论】:

  • 我尝试实现这一点,但构建失败,它突出显示lastElement 并显示错误消息:“使用未解析的标识符'lastElement'”我该如何解决这个问题?
  • lastElement 在这里只是一个参考,您必须先在代码中定义并将其设置为项目列表中的最后一个索引路径。
  • 简而言之 lastElement = .count 并且你必须在你的类中全局定义。
  • 要获取项目中的行数,计算我创建的数组中的对象数量。所以我将lastElement 更改为objectIDArray.count ,然后在括号内我使用相同的代码来获取下一个对象,但是这次我让它跳过objectIDArray.count,所以我不加载已经存在的对象。 但是当我尝试这个时,什么都没有发生,也没有加载任何新内容。我做错了什么?
  • 我在这里提出了一个新问题:stackoverflow.com/questions/45665796/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
相关资源
最近更新 更多