一套用于与 Facebook ComponentKit 一起工作的辅助工具和功能。该库通过 CocoaPods 安装后是模块化的。它目前有以下模块:
ComponentKit 为 UICollectionView
提供了一个名为 CKCollectionViewTransactionalDataSource
的 CKTransactionalComponentDataSource
接口。而 CKTableViewTransactionalDataSource
提供了相同的接口,但适用于 UITableView
,尽管有一些必要的和有用的不同之处和增加。
是的,但也不一定。 UICollectionView
提供了大量的灵活性,但开箱即用得较少。 whereas UITableView
的优势在于其熟悉且用户友好的原生功能,如
所有这些都可以通过 UICollectionView
实现,但具体实现取决于您。
CKTableViewTransactionalDataSource
的基本实现相当简单,但是为了显示 UITableView
的全部功能,还需要额外的 API。
UICollectionView
向其布局对象留下了很多权力。这对于 ComponentKit 来说是有用的,因为我们可以通过一个完全独立的线程对象来完成大部分与动画相关的自定义,而不需要 CK 介入。但对于 UITableView
就不适用了。例如,当在 -beginUpdates
、-endUpdates
事务中添加/删除/更新/删除行和分区时,必须指定原生动画。为了公开这些功能,CKToolbox 提供了一个简单的数据对象 CKTableViewTransactionalDataSourceCellConfiguration
,可以配置
可以通过初始化器传递默认配置,并使用 CKTableViewTransactionalDataSourceCellConfigurationKey
或通过 “cellConfiguration” 参数方法使用的方法覆盖 userInfo
字典中提供的配置。
预期的使用模式是
-[CKTableViewTransactionalDataSource cellConfiguration]
,它始终返回一个副本),更改您希望覆盖以进行更新操作的任何属性。在数据源更新中传递此对象。它将仅在该操作中覆盖默认配置。此模式的良好示例在提供的演示应用中使用:由于数据源使用-beginUpdates
/-endUpdates
事务将所有更改入队,因此在插入初始内容时会有动画。也许我们不希望这样,希望立即看到初始内容,但在所有后续更新中使用动画。在这种情况下
-animationsDisabled
属性禁用所有动画,并使用此配置覆盖仅此操作的默认配置。UICollectionView
和UITableView
都共享非常相似的API。因此,CKTableViewTransactionalDataSource
实际上实现了CKTransactionalDataSourceInterface
,该接口抽象了CKCollectionViewTransactionalDataSource
接口的核心部分。因此,如果您想实现与组件化集合的最终输出视图无关的某种架构,您可以为类型提供接口id <CKTransactionalDataSourceInterface>
。这样,除了实例化之外,所有集合操作本质上都是相同的。
提供了一个演示应用,这是一个简单引用应用,其中包含来自WWF物种目录的濒危动物列表。滑动单元格以显示更多功能。
UITableView
的非主要功能在初始版本中仅得到粗略支持。可能会有很多缺少updateConfiguration:mode:...
)目前似乎不太满意CKTableViewTransactionalDataSourceCellConfiguration
中,但对于现在也可以在UITableViewDelegate
方法中支持。例如,演示应用使用-tableView:willDisplayCell:forRowAtIndexPath:
。CKCollectionViewDataSourceChangesetBuilder是ComponentKit的CKTransactionalComponentDataSourceChangeset
的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)
。ComponentKit
主要用 Obj-C++ 编写,这意味着您通常会在 Obj-C++ 上下文中使用它。虽然您可能可以从 Swift 上下文中创建更改集,但我认为这并不足以证明在此期间实施另一项计划的合理性。当然,如果有人愿意实现它,我将很高兴接受一个 PR!
ComponentKit 直接支持插入内容,并显式删除项目和分区,但并不直接支持轻松清除数据源完整的内容。CKTransactionalComponentDataSourceRemoveAll
提供了返回可以用于删除数据源中当前存在的所有项目和分区的更改集的方法 - (CKTransactionalComponentDataSourceChangeset*)removeAllChangeset
。为 CKTransactionalComponentDataSourceState
和 CKCollectionViewTransactionalDataSource
提供了实现。此外,CKTableViewTransactionalDataSource 实现了此协议。
RemoveAll
模块合并到新的 "Core" 模块中。这使得功能更加方便使用。