【问题标题】:How to load more data in UITableView using pull to refresh or any other delegate methods in swift?如何使用拉刷新或任何其他委托方法在 UITableView 中快速加载更多数据?
【发布时间】:2018-10-23 17:26:25
【问题描述】:

我正在我的应用程序中实现聊天功能,我想在用户拉动以刷新类似于我们在 iMessage 上的内容时显示更多聊天消息。我一直在探索各种选项,但找不到任何简单的解决方案来实现这一点。

我已经实现了拉动刷新功能。任何人都可以在拉刷新功能或使用任何表视图委托方法中编写步骤或代码来实现此功能吗?

附:我不想使用 cocoapods 或任何 3rd 方代码。

这是我的拉动刷新功能

    // Pull to refresh
    @objc func refresh(_ refreshControl: UIRefreshControl) {
    fetchMessages(completed: {
        self.messagesTable.reloadData()
    })

    refreshControl.endRefreshing()
}

【问题讨论】:

  • 欢迎来到 SO。请分享您已经尝试过的内容和无效的内容。如果您正在寻找某人来编写您的代码,您可能想寻找其他地方。
  • 没有尝试,因为我不知道我到底需要做什么。我找不到任何逻辑。我不是要求任何人编写代码。我想要逻辑。
  • @DaveMS - 谷歌搜索 swift uitableview pull-to-refresh 会找到很多教程、演示、讨论等。可能是一个很好的起点。
  • 我不确定您要的是什么。您是否正在尝试实现 fetchMessages 方法?如果是这样,不知道您的数据源或任何实现细节有点困难。是否有不想使用任何 3rd 方库的理由?有许多几乎内置了您可以轻松实现的聊天功能。

标签: ios swift uitableview pull-to-refresh


【解决方案1】:

iMessage 中其实并不是拉刷新。它称为延迟加载。延迟加载意味着当您拥有大量数据并对其进行分页时。因此,为了获得像表格视图一样的聊天记录:

  • 将您的聊天数据库分割成小部分,例如每片 10-20 条消息。
  • 在表格视图中加载最后一个切片。
  • TableView...WillDisplayCellForRow... 中检测表格视图的第一行何时显示。
  • 加载另一个切片并插入到表格视图的顶部

【讨论】:

  • 是的,正如我在其他各种答案和 tuts 中看到的那样,您的方向也是正确的。如果我们实现 WillDisplayCellForRow,拉刷新会发生什么?我们是否必须删除拉动才能刷新?
  • 没有必要 pull 也没有必要 refresh 因为新消息不是来自顶部,如 instagram 等;)
  • 我正在尝试这种方法,因为这是我目前能理解的最好的方法,而且似乎是最简单的。关于拉刷新,我会保留它,因为我想在用户拉刷新时显示加载图标,就像在 iMessages 中一样。
【解决方案2】:

将此视为项目的分页列表。让您一次获取并显示100 项目。当用户请求更多时,您获取更多 100 项目并将其呈现到您的聊天详细信息页面。

现在在一般形式中,您维护一个offsetlimit 变量,它们是Int 类型。如果您熟悉分页 api 的 offsetlimit 可以忽略下一节。

假设您首先获取第 0-100 条消息,在这种情况下,您的 offset 将是 0limit 将是 100。提取操作完成后,您的offset 变量将更新为100。因此,下次获取时,您会从第 101-200 条消息中获取并将offset 值更新为200。这样你就可以了。

所以你必须维护offsetlimitlimit 变量表示一次要获取的项目数。

因此,每当您拉动刷新 tableview 时,您都会根据 offsetlimit 获取项目并填充数据项,然后更新 tableview。

主要是为了更新表格视图,只需在填充数据数组后重新加载表格视图。如果您只想在 tableview 中加载新项目,请查看appledoc

func insertRows(at indexPaths: [IndexPath], 
       with animation: UITableView.RowAnimation)

编码愉快。

【讨论】:

  • 德克萨斯州。这就是我正在寻找的,除了数组是反向的,即当你像在 iMessages 中看到的那样拉动刷新时,我想在屏幕顶部加载更多数据。因此,首先我将获取最新消息(假设是最新的 100 条消息),然后在拉取刷新时获取 100 多条旧消息,依此类推。因此,在我的情况下,我会将项目添加到数组并重新加载表。我担心的是,当我在获取数据后重新加载表时,它会重新加载整个(新)表吗?
  • 获取后你的意思是将 msg 的对象存储到一个用于 tableview 数据源的数组中,因此重新加载 tableview 也会加载新项目。
  • 如果您想使用完全不同的代码数据将消息对象存储在本地数据库中。您将 tableview 连接到 coredata 查询,以便每当查询结果更新时,您的 tableview 都会自动更新。在这种情况下,只需将消息对象存储在 coredata 中就会自动同步 tableview。
  • 看看这个问题的答案:stackoverflow.com/questions/31870206/… 它展示了如何在不重新加载所有数据的情况下更新表。效率更高。
  • 是的,这就是我在第二部分中的建议。首先只需重新加载 tableview 并检查所有数据是否正在呈现。您可能会遇到一些 UI 故障,例如 tableview 滚动到顶部/底部,对于这些故障和优化,您将使用 insertRows 将新获取的项目插入到您的 tableview 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多