如何在 UITableView 中显示数组中的 x 个对象,然后在向下滚动时显示更多?
Posted
技术标签:
【中文标题】如何在 UITableView 中显示数组中的 x 个对象,然后在向下滚动时显示更多?【英文标题】:How to display x number of objects from array in a UITableView, then display more on scroll down? 【发布时间】:2015-07-30 23:57:20 【问题描述】:我正在 swift 中开发一个游戏应用程序,该应用程序当前有一个 tableView 显示分数、尝试次数等,从解析中下载到数组中。
但是,如果用户多次玩游戏,此表可能会变得很长。所以我想通过在表格视图中显示数组的前 20 个对象来改进应用程序,然后,一旦用户向下滚动到表格的末尾,它会自动添加更多行并显示接下来的 20 个对象数组(连同原来的 20,使 tableview 现在变成 40 行)
如果有人熟悉 twitter 应用程序,那正是我想要的。最初会显示一定数量的推文,然后向下滚动到表格末尾时会加载更多推文,以减少加载时间。
问题是,我真的不知道如何实现这一点。我从来没有遇到过只需要使用数组的一部分的情况。任何帮助将不胜感激。丹
【问题讨论】:
投反对票可能是因为范围太广。问一个特定的 UI 问题,例如我在下面回答的问题,或者问一个特定的模型操作问题。 UiTableView 是一个虚拟列表,它会在数据进入视图(或前面)时调用您。您只需回答回调,它就会处理和加载部分数据(并将行销毁)。所以,这个问题的答案是你不应该……对吗? 没有。阅读我的 cmets @bryanmac 的答案。 实际上,这就是数据源回调在 UITableView 上的工作方式——它通过回调数据来保持低内存,如果你重复使用单元格,它会保持低内存。 【参考方案1】:UITableView 是一个虚拟视图,它会在其中调用您的数据,以便为视图中的给定行创建单元格并销毁视图之外的单元格。您还应该重复使用已创建的单元格。
所以,我认为您关于预加载列表部分的问题的答案是……您不应该这样做。只需实现数据源并响应数据回调即可。
更多here in the apple docs on the datasource for a UITableView
【讨论】:
但 Twitter 和 FaceBook 以它们的方式工作是有原因的...支持数据很大,无法在设备内存中表示...所以支持数据必须按需加载。大概这就是 OP 最终打算做的事情。 带回调的数据源接口不会加载内存中的所有数据。这是一种虚拟回调机制——当单元格进入视图时,它会回调您获取第 x 行的数据。当数据滚动出视图时,它会破坏单元格。这就是为什么它是逐行回调机制的原因。我已经实现了它几乎由成千上万个项目支持并保持低内存。这也是为什么他们告诉您重复使用看不见的单元格的原因。你读过我提供的链接吗?【参考方案2】:这在 Objective-C 的 How to know when UITableView did scroll to bottom in iPhone 中得到解决。如果需要任何帮助将其翻译成 Swift,请发表评论,我会更新答案。
编辑——真正的问题:
tableView 委托方法允许您在数据和表的可查看数据之间执行任意逻辑/映射。因此,当您确实检测到滚动到底部时,增加一个内部状态变量,例如声明为类范围存储属性的var rowsToReveal
。递增后,拨打tableView.reloadData()
。然后重新编写 numberOfRowsInSection
委托方法以使用 rowsToReveal
而不是 someDataArray.count
或您拥有的任何硬编码值。当然,请确保 rowsToReveal
永远不会超过计数,否则会立即崩溃。
【讨论】:
不完全。该链接很有用,我对此表示感谢,但我强调的问题中更紧迫的部分是如何仅在 tableView 中显示数组的前 x 个对象。这意味着如果我有一个包含 500 个对象的数组,我如何只显示前 20 个,然后在向下滚动到底部时增加 tableview 的行。该链接仅回答如何知道用户何时向下滚动到底部。以上是关于如何在 UITableView 中显示数组中的 x 个对象,然后在向下滚动时显示更多?的主要内容,如果未能解决你的问题,请参考以下文章
使用数组项属性值在 UITableView/UICollectionView 中显示
如何在没有数组的 UITableView 中显示 UITableView Cell?
从 Json Array 在 UITableView 上显示图像