LLTableViewAdapter 0.0.1

LLTableViewAdapter 0.0.1

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布时间最新发布2014年12月

未认证维护。



  • Lawrence Lomax

这是一个简化并去除驱动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 语句。

待办事项

  • 更多单元测试
  • 正确支持适配数据条目的抽取/注入,以简化输入/输出
  • 递归方式支持 setSelectedItem/s
  • 支持多选
  • 添加TableView操作和回调(单元格出现、移动等)
  • 单元输入(UITextField,开关)
  • 为新的iOS特性提供额外的回调,无需运行时检查
  • 针对数组变化的智能更新
  • 如果数组没有深度,则无需section,直接显示单元
  • 对有序字典提供索引支持
  • 更安全、自适应且更健壮的递归算法

感谢与贡献

如果您有任何贡献,请发送pull request,我会审阅。一旦准备就绪投入使用,我计划将其添加到CocoaPods Spec仓库。

许可证