这是一个简化并去除驱动UITableView所需大量冗余的库。它需要一些工作和大量的单元测试。
首选方法是使用Cocoapods。如果您还没有使用它,请检查它,它很棒。将以下内容添加到您的Podfile
pod 'LLTableViewAdapter', :git => 'https://github.com/lawrencelomax/LLTableViewAdapter.git'
我计划在应用程序准备好用于生产使用时尽快将规范添加到仓库中
库有一个依赖项,即libextobjc/EXTKeyPathCoding
。我可能最终会去掉这个依赖。否则,需要ARC,您可以将应用程序部署到iOS 5.0
适配器将数组字典层次结构转换为最小努力的TableView。您将表格定义为字典数组的列表。
@[
@{ kLLTableViewAdapterName : @"Section 1" , @"kLLArrayControllerChildren" : @[
@{kLLTableViewAdapterName : @"Row 1"},
@{kLLTableViewAdapterName : @"Row 2"}
] },
@{ kLLTableViewAdapterName : @"Section 2" , @"kLLArrayControllerChildren" : @[
@{kLLTableViewAdapterName : @"Row 1"},
@{kLLTableViewAdapterName : @"Row 2"}
] }
]
以下是您可以在单元格/分区字典中使用的其他常量
kLLTableViewAdapterName
- 将放入textLabel
的字符串,如果您希望kLLTableViewAdapterConfigurator
来完成此操作,则留空
kLLTableViewAdapterAction
- 当调用didSelectRow
时执行的动作表示的块。如果设置了属性defaultAction
,将对所有单元格执行默认操作
kLLTableViewAdapterDelete
- 当为删除操作调用willCommitEditingStyle
时执行的动作表示的块。如果设置了属性defaultDeleter
,将对所有单元格执行默认删除操作。如果设置了默认删除器或每个单元格的删除器,单元格将仅显示删除操作
kLLTableViewAdapterView
- 返回UIView/UITableViewCell或UIView/UITableViewCell的块。对于TableViewCell,块的类型是LLTableViewAdapterCellFactory
,对于分区标题,块的类型是LLTableViewAdapterHeaderFactory
。如果类型是UIView/UITableViewCell,请确保返回的视图不会被其他单元格使用,否则在滚动时可能导致视图弹出。如果类型是UITableViewHeaderFooterView,该块是返回UITableViewHeaderFooterView的块
kLLTableViewAdapterConfigurator
- 表示单元格/分区标题配置的块。每次调用cellForRow
时都会调用此操作,无论单元格是否被重用。这对于单元格工厂来说在语义上是不同的,单元格工厂之所以重要,是因为它有关创建TableView单元格。用于设置单元格上的数据,如文本标签、图像等,而不仅仅是添加子视图(除非您在之前删除了现有视图)。可以使用defaultCellConfigurator
为所有单元格设置
kLLTableViewAdapterCellIdentifier
- 一个返回当前行单元格标识符的 `NSString` 的代码块,或者返回单元格标识符的 `NSString`。这将自动执行所有 deque 和重用操作。每当需要实例化新单元格时,或者每当调用 cellForRow
时,都会调用工厂。如果返回 nil 或未设置值,则停止重用当前索引路径的单元格。可以使用 defaultCellIdentifier
中的字符串在全局范围内设置,或者使用 defaultCellIdentifierGetter
设置代码块。
kLLTableViewAdapterHeight
- 一个返回当前区段/行的单元格/区段高度的 `CGFloat` 代码块,或者返回表示行高度的包装在 `NSNumber` 中的浮点数。可以使用 defaultSectionHeaderHeight/defaultCellHeight
在全局范围内设置为 `CGFloat`,或者使用代码块设置为 defaulSectionHeaderHeightGetter/defaultCellHeightGetter
。
TableView 的许多样板代码都花在了通过 IndexPath 从其他数据结构中提取单元格数据上。使用 LLArrayController
来执行此操作。如果你希望从给定索引路径的字典中提取特定数据,还可以对其进行子类化。
它还管理选择(多个和单个),这对于 TableViews 非常有用。通过在 LLArrayController 中设置数据数组,TableView 将自动更新。
通过实现复制功能,在使用此适配器时,通过在栈上推入和弹出当地时间表视图控制器,可以更容易地创建层次结构。支持使用 NSUInteger
进行子脚本,它会返回立即的子数据结构。支持使用对象进行子脚本,但仅适用于 NSIndexPath
,你可以使用它来获取特定 IndexPath 的对象。
此库提供的一个便利是,可以使用代码块来处理许多常见 Table View 事件,这些事件由代理和数据源接收。所有代码块方法都通过适配器传递,因此你可以访问 ViewController、TableView 和数据结构。如果你希望使用自定义的 ViewController 方法,你可以转换适配器的 ViewController 属性,或者在代码块中捕获 ViewController。一定要特别小心,确保在驾驶代码块时,始终使用弱引用间接引用 ViewController。
适配器不会被 TableView 保留,所以你需要将适配器存储在实例变量中,以保持其激活状态。这通常是 ViewController 中的一个 ivar。
另外,不要忘记在将它们放入字典时复制您的代码块。用于定义所有单元格的默认行为的代码块将被复制,但字典默认情况下可能不会这么做。ARC 现在处理了很多这些操作,但第一次复制之后,block_copy
将代码块移动到堆上的开销几乎可以忽略不计。
此库不适用于大型数据集,因为当你为适配器创建数据结构时,可能需要初始化所有数据,并且这些数据需要在一开始就创建。
它非常适合导航的表格视图;数组中的每个单元格都可以关联一个动作块,该块将在按下单元格时触发。通过将动作行为封装在代码块中,可以避免一些为选择合适的单元格动作而进行的 if-else-if-else
语句。
如果您有任何贡献,请发送pull request,我会审阅。一旦准备就绪投入使用,我计划将其添加到CocoaPods Spec仓库。