CKToolbox 0.2.1

CKToolbox 0.2.1

测试已测试
语言语言 Objective C++Objective C++
许可证 MIT
发布日期上次发布2016年8月

Jonathan Crooke维护。



CKToolbox 0.2.1

  • Jonathan Crooke

一套用于与 Facebook ComponentKit 一起工作的辅助工具和功能。该库通过 CocoaPods 安装后是模块化的。它目前有以下模块:

  1. CKTableViewTransactionalDataSource
  2. CKCollectionViewDataSourceChangesetBuilder
  3. CKTransactionalComponentDataSourceRemoveAll

1. CKTableViewTransactionalDataSource

ComponentKitUICollectionView 提供了一个名为 CKCollectionViewTransactionalDataSourceCKTransactionalComponentDataSource 接口。而 CKTableViewTransactionalDataSource 提供了相同的接口,但适用于 UITableView,尽管有一些必要的和有用的不同之处和增加。

但我以为 UICollectionView > UITableViewDataSource 呢?

是的,但也不一定。 UICollectionView 提供了大量的灵活性,但开箱即用得较少。 whereas UITableView 的优势在于其熟悉且用户友好的原生功能,如

  • 编辑模式,包括滑动删除/编辑和重新排序。还有可以为 iOS 8.0+ 定制的自定义编辑动作
  • 简单的“浮动”分区标题/页脚,或视图
  • 原生附件,以及附件视图支持
  • 项目分隔符,以及样式
  • 整个表格头部和页脚视图
  • 分区标题索引滚动条

所有这些都可以通过 UICollectionView 实现,但具体实现取决于您。

CKTableViewTransactionalDataSource 的基本实现相当简单,但是为了显示 UITableView 的全部功能,还需要额外的 API。

CKTableViewTransactionalDataSourceCellConfiguration

UICollectionView 向其布局对象留下了很多权力。这对于 ComponentKit 来说是有用的,因为我们可以通过一个完全独立的线程对象来完成大部分与动画相关的自定义,而不需要 CK 介入。但对于 UITableView 就不适用了。例如,当在 -beginUpdates-endUpdates 事务中添加/删除/更新/删除行和分区时,必须指定原生动画。为了公开这些功能,CKToolbox 提供了一个简单的数据对象 CKTableViewTransactionalDataSourceCellConfiguration,可以配置

  • 不同操作的手机动画
  • 样式 - 选择和焦点
  • 选项,如缩进、编辑和重新排序
  • 布局
  • 附件
  • 完整的动画关闭开关

用法

可以通过初始化器传递默认配置,并使用 CKTableViewTransactionalDataSourceCellConfigurationKey 或通过 “cellConfiguration” 参数方法使用的方法覆盖 userInfo 字典中提供的配置。

预期的使用模式是

  • 在实例化数据源时传递默认单元格配置。
  • 复制默认配置(-[CKTableViewTransactionalDataSource cellConfiguration],它始终返回一个副本),更改您希望覆盖以进行更新操作的任何属性。在数据源更新中传递此对象。它将仅在该操作中覆盖默认配置。
  • 在实例化后无法更改默认配置。这是按设计进行的,假设没有合理的案例希望这样做

此模式的良好示例在提供的演示应用中使用:由于数据源使用-beginUpdates/-endUpdates事务将所有更改入队,因此在插入初始内容时会有动画。也许我们希望这样,希望立即看到初始内容,但在所有后续更新中使用动画。在这种情况下

  • 默认配置指定了我们希望稍后使用的动画。
  • 在入队初始内容时,我们复制配置,使用-animationsDisabled属性禁用所有动画,并使用此配置覆盖仅此操作的默认配置。
  • 使用覆盖的配置后内容立即出现,但所有后续更新将使用默认配置。

CKTransactionalDataSourceInterface

UICollectionViewUITableView都共享非常相似的API。因此,CKTableViewTransactionalDataSource实际上实现了CKTransactionalDataSourceInterface,该接口抽象了CKCollectionViewTransactionalDataSource接口的核心部分。因此,如果您想实现与组件化集合的最终输出视图无关的某种架构,您可以为类型提供接口id <CKTransactionalDataSourceInterface>。这样,除了实例化之外,所有集合操作本质上都是相同的。

演示应用

提供了一个演示应用,这是一个简单引用应用,其中包含来自WWF物种目录的濒危动物列表。滑动单元格以显示更多功能。

当前问题

  • 许多UITableView的非主要功能在初始版本中仅得到粗略支持。可能会有很多缺少
  • 通过重新排序控件调整大小当前无法工作,或者至少看起来是这样的
  • 设备旋转组件的大小调整(通过updateConfiguration:mode:...)目前似乎不太满意
  • 目前直接不支持底层表格单元格的配置。例如,您可能希望调整单元格的背景色以匹配您的UI。这可以很容易地添加到CKTableViewTransactionalDataSourceCellConfiguration中,但对于现在也可以在UITableViewDelegate方法中支持。例如,演示应用使用-tableView:willDisplayCell:forRowAtIndexPath:

2. CKCollectionViewDataSourceChangesetBuilder

CKCollectionViewDataSourceChangesetBuilder是ComponentKitCKTransactionalComponentDataSourceChangeset的DSL构建器。它受到了Masonry的极大启发,应该允许您为构建更改集编写非常易于阅读的代码。

如何使用它?

CKCollectionViewDataSourceChangesetBuilder 使用动词、名词和介词,旨在让您能够用易读的英文表达您的修改集构建,仅有少数例外。以下是一些示例来说明这一点。

    [CKCollectionViewDataSourceChangesetBuilder build:^(CKCollectionViewDataSourceChangesetBuilder *builder) {
      builder.insert.section.at.index(0);
      builder.insert.item(@"Foo").at.indexPath([NSIndexPath indexPathForItem:1 inSection:4]);
      builder.remove.section.at.index(1);
      builder.move.section.at.index(0).to.index(4);
    }];

由于关键词数量有限,可能的组合应该相对容易理解。如果语法使用不当,构建器将被编写为抛出有用的异常。

CKCollectionViewDataSourceChangesetBuilderTests 提供了所有语法组合的示例,因此请首先查看该部分。

辅助宏

  • ck_indexPath(ITEM, SECTION) 用于保存重复使用 [NSIndexPath indexPathForItem:inSection:]

以下两个宏旨在弥补 Objective-C 缺少默认参数的问题;在移动或删除项目时,我们需要重复使用动词 item。然而,由于我们没有可插入的对象,必须使用 nil。这几乎不可读。相反,您可以使用

  • ck_removeItem 代替 remove.item(nil)
  • ck_moveItem 代替 move.item(nil)

为什么没有 Swift?

ComponentKit 主要用 Obj-C++ 编写,这意味着您通常会在 Obj-C++ 上下文中使用它。虽然您可能可以从 Swift 上下文中创建更改集,但我认为这并不足以证明在此期间实施另一项计划的合理性。当然,如果有人愿意实现它,我将很高兴接受一个 PR!

3. CKTransactionalComponentDataSourceRemoveAll

ComponentKit 直接支持插入内容,并显式删除项目和分区,但并不直接支持轻松清除数据源完整的内容。CKTransactionalComponentDataSourceRemoveAll 提供了返回可以用于删除数据源中当前存在的所有项目和分区的更改集的方法 - (CKTransactionalComponentDataSourceChangeset*)removeAllChangeset。为 CKTransactionalComponentDataSourceStateCKCollectionViewTransactionalDataSource 提供了实现。此外,CKTableViewTransactionalDataSource 实现了此协议。


变更日志

v0.2.0

v0.1.0

  • 初始发布。

玩得开心!

MIT 许可证 >> [email protected]