NSTableView无限滚动或分页

时间:2014-04-04 03:59:06

标签: objective-c cocoa nstableview nsscroller

How to determine if a user has scrolled to the end of an NSTableView有关 谢谢Josh。

有没有办法使用这种机制来实现提供某种无限滚动或分页的NSTableView。

这个想法是告诉NSTableView加载一定数量的记录,比如一次记录1k记录,而当用户滚动到最后时,拉出另外1k记录,可能会忘记前1k记录。

这种模式在Web应用程序和java中得到了很好的定义/使用。最初只加载可见行数,其余部分在用户在表格中向上和向下滚动时被拉为异步。

我对一些obj-c代码或如何编写代码的技巧感兴趣。 我知道过滤/限制进入tableview的记录数量,但暂时忽略它。

感谢。

2 个答案:

答案 0 :(得分:0)

我对iOS有更多了解,但我认为答案是类似的。表视图本质上是有限的,但您可以滚动自己的自定义滚动视图来执行此操作。诀窍是设置一个大的内容大小并在子类中实现布局(每次滚动更改都会调用它)。在该方法中,检查内容偏移是否接近零或接近内容大小。如果是,则将内容偏移量转换回内容大小的中心,并将所有子视图(将它们保留在一个父内容视图上)转换相同的距离,以便用户不会看到任何动作。制定一个数据源协议并不断向数据源询问" cell"平铺视图的可见部分。

应该由数据源来识别我们在过去的日子中所谓的页面错误,以确定应该丢弃内存中的某些模型以支持用户滚动的模型。 / p>

我在寻找一个相当于NS的东西,但是没有看到一个粗略的搜索。 Here's a decent-looking reference on the idea done in iOS

答案 1 :(得分:0)

鉴于您提供的详细信息,我会稍微概括一下,但这是我可以解决的问题:

首先,我设置了一个小于1000条记录的小批量大小。如果结果计数或“大多数人都想要看到”是不确定的(听起来就像你的情况),用户可能甚至不关心前100个左右。如果您的用户经常要求一个庞大,昂贵的列表,并且立即想要看到距离开头很远的东西,他们向下滚动滚动器两分钟直到他们停下来环顾四周,也许是更直观的排序需要订购而不是要求Google Image提供1000个更多动画小猫GIF。 ; - )

(绝对基于视图的视图重用)表视图后面的控制器将需要某种请求队列,因为我假设您正在批量处理,因为它们单独检索是昂贵的。这将管理异步请求/现在已经加载的机器(我知道这很模糊,但需要更多细节才能更具体)。您将确保任何“当前活动”视图以某种方式获得此“已准备好”通知,并将从一些“忙碌”UI状态转到显示就绪项目(因为我们从不想让表格等待准备就绪 - 显示给定行上对象的视图,因此视图至少应显示一些“仍在等待详细信息”的指示,因此快速滚动大量行不会拖延任何内容。

使用基于视图的NSTableView和关联的数据源方法将使表视图句柄只保留自定义NSTableCellView的足够副本,以便在滚动期间重用。由于您在被询问时必须提供已配置的视图,因此视图的默认状态可以是“如果没有准备就绘制任何内容”或一些可视通用占位符,直到对象实现并准备就绪(然后您可以重新加载该行而不是整个表)。通过这种方式,表格可以快速滚动和绘制,因为它不关心控制器正在做什么来履行更新可见行的承诺(您的自定义单元格视图将观察其表示的对象的更新)。

如果上限是天文数字,您可能希望滚动条反映到目前为止总批次的行数 - 反映该尺寸会使滚动夹具既微小又非常敏感。相反,只需按用户到目前为止“请求”的内容(通过表视图的行数)增长,一直回到列表的开头。无论何时批量处理,您都需要将批量大小添加到控制器的总批次行数中。这仍然允许滚动器按行缩放,用户无论如何都无法以该速度进行区分。您将行计数更改传递给表视图,方法是将其发送到-noteNumberOfRowsChanged并回复其结果数据源请求(-numberOfRowsInTableView:),其中包含您在控制器属性中保存的更新总行数。它会根据需要询问新可见行的视图(这将是一些中性,未实现的视觉状态,直到它像以前一样实现),更新滚动视图,泡沫,冲洗,重复。

你可以use NSCache来降低内存使用率。将其countLimit设置为批量大小的几倍,如果它确定需要转储第一个 n 模型对象,则让它删除以前的批次,然后如果表视图突然请求则将它们重新批处理对于不再在批处理窗口范围内的行的视图。

在不了解您的要求和架构的情况下,很难更具体。如果我没有达到标记,请考虑编辑您的问题以包含更多细节。如果我完全偏离你的要求,请澄清。 : - )