- 无须直接调用
performBatchUpdates(_:, completion:)或reloadData() - 更加现代的链式 Swift API
- 支持基于
Result Builder的声明式构建写法,支持Flow control - 支持
Property Wrapper形式的数据源 - 自动根据数据模型选择更新方式 (基于
Diff),且可自定义 - 一维列表支持任意
Collection作为数据模型 - 创建具有多个数据类型的列表
- 支持不限于二维的复杂
Diff - 支持单一数据源绑定多个 List
- 支持任何
UICollectionViewLayout - 支持 SwiftUI
除了 Readme 以外,本项目有 iOS Project,Playground,SwiftUI Preview 几种例子形式,强烈建议下载后在 ListKitExample 中查看
class EmojisViewModel: TableListAdapter {
var data = "🥳🤭😇"
var tableList: TableList {
CollectionElements(data)
.cellForRow(UITableViewCell.self) { cell, context, char in
cell.textLabel?.text = "\(char)"
}
}
}通过 adopt 协议 TableListAdapter,将 String 这个 Collection 传入 CollectionElements.init(_ collection: some Collection),然后通过链式写法实现 tableList ,我们就以非常少量的代码实现了一个 TableView 的静态数据源
然后通过 tableView.adapted(by: adapter) 即可将数据绑定至 UI。
如需更新,可以通过如下方法更新,通过 Diff,只会在 tableView 底部新插入两个 Cell
emojiViewModel.data += "🧐😚"
emojiViewModel.performUpdate()二维数组也支持,这个例子中还支持了点击 Cell 时打印对应数据模型
class NumbersViewModel: TableListAdapter {
var data = [[1, 2, 3], [4, 5, 6]] {
didSet {
performUpdate()
}
}
var tableList: TableList {
SectionsElements(data)
.cellForRow(UITableViewCell.self) { cell, context, element in
cell.textLabel?.text = "\(element)"
}
.didSelectRow { context, element in
print(element)
}
}
}跨行 Diff 也同样支持,下例中通过更新会看到 3 对应的 cell 会移动到下一个 section
roomViewModel.data = [[1, 2], [4, 5, 6, 3]]将下面一行添加进 Cartfile 即可:
github "Alpensegler/ListKit"
在 Xcode 中,点击 "Files -> Swift Package Manager -> Add Package Dependency...",在搜索栏中输入 "https://github.com/Alpensegler/ListKit"