适用于 Mac OS X 10.5 及以上版本的优化列表视图控制。这是我写完这篇文章后创建的。
PXListView 采用新 BSD 许可证。
PXListView
与 iPhone 的 UITableView
类似,通过入队和出队用于显示行的 NSView
来进行优化,以便在列表中有大量行时保持低内存占用,同时仍允许每个行由一个 NSView
来表示,这比处理单元格更容易。
该控制器的架构基于Tweetie (Mac) 和 Echofon (Mac) 中存在的列表视图控制器。
该项目仍然是非常正在进行中的工作,因此目前尚无文档。
列表视图中的每一行都使用一个 PXListViewCell
实例(这是一个 NSView
的子类)来显示。为了控件能够正常工作,PXListView
的代理响应当前三个消息
numberOfCellsInListView
-listView:cellForRow
-listView:heightOfRow
在 Interface Builder 中设置 PXListView 可以通过以下几个简单的步骤完成
NSScrollView
拖动到您想要放置列表视图的位置。NSScrollView
的类设置为 PXListView
。NSScrollView
的文档视图类设置为 PXListViewDocumentView
。PXListViewCell
是一个抽象超类,实现了诸如单元格选择之类的最小功能,并声明了列表视图所依赖的方法。
使用列表视图时,您应该创建一个具体的PXListViewCell
子类。在这个子类中,可以重写drawRect:
方法来进行自定义绘制,并可以在该子类上声明单元格UI输出或数据的属性。项目示例(作为仓库的一部分)显示了这一点。由于PXListViewCell
是视图,所以使用NIB设计单元格模板变得非常容易,也使得添加文本字段、按钮、图像等过程变得更简单。
在响应-listView:cellForRow:
时,代理应首先在列表视图中调用-dequeueCellWithReusableIdentifier:
,传入可重用单元格标识符,以检查是否有可重用单元格可用。如果这返回nil
,则可以使用声明在PXListViewCell
上的初始化方法initWithReusableIdentifier:
创建新的单元格。这通过重用已滚动出屏幕、从视图层次结构中删除并缓存的单元格,尽可能降低控制台的内存占用。
您也可以通过使用PXListViewCell
的类方法+cellLoadedFromNibNamed:reusableIdentifier:
轻松地从NIB中加载单元格。此方法加载传入名称的NIB,并返回找到的第一个列表视图单元格。要创建与此功能兼容的NIB,只需创建一个空白NIB并添加一个视图。确保将其类设置为您的PXListViewCell
子类名称,布局单元格,然后保存。当您使用您的NIB名称调用+cellLoadedFromNibNamed:reusableIdentifier:
时,新的单元格将自动释放并返回,然后可以从-listView:cellForRow:
返回。无需为新的NIB设置文件所有者。
PXListView
有一个属性usesLiveResize
,用于确定是否在调整大小时连续更新控制台。默认情况下,单元格将在控制台调整大小时连续更新。尽管这从视觉上更可取,尤其是在处理大数据集时,但这可能导致UI变得缓慢,因此可以通过将该属性设置为NO
来关闭此功能。
PXListView
仅保留视图层次结构中列表视图单元格的最小量以实现性能,并在滚动显示屏上的行时向视图层次结构中添加新单元格以显示行,当行滚动出屏幕时,相关的单元格将从视图层次结构中删除。
感谢Mike Abdullah对单元格脱队相关的优化。
感谢Uli Kusterer为PXListView添加和修复功能,包括惯性滚动、键盘导航、变量行高(使用CGFloats)、无障碍功能以及拖放支持。
感谢Tom修复了加载数据时的内存问题。
PXListView在以下条件下授权(改编自OSIhttp://www.opensource.org/licenses/bsd-license.php)
版权所有 © 2011, Alex Rozanski。保留所有权利。
在以下条件得到满足的情况下,允许以源代码形式和二进制形式重新分发和使用,无论是否修改:
本软件由版权所有者和贡献者“按原样”提供,任何明示或暗示的保证,包括但不限于适销性和适用于特定目的的保证,均予以拒绝。在任何情况下,版权所有者或贡献者均不对任何直接、间接、偶然、特殊、示范性的或后果性的损害(包括但不限于替代货物或服务的采购;使用、数据或利润的丧失;或业务中断)承担责任,无论该损害是由任何原因引起,无论在合同、严格责任还是在侵权(包括疏忽或不作为)的法律理论下。