DiffableUI 是一组构建于 UICollectionViewCompositionalLayout 和 UICollectionViewDiffableDataSource 之上的包装器和助手,旨在帮助你在 UIKit 世界中编写简洁、可重用且类似 SwiftUI 的代码。
要使用 DiffableUI,你必须创建一个继承自 DiffableViewController
的 UIViewController
,重写 sections
计算变量,并在你想要视图重新计算时调用 reload()
,如下所示
final class ExampleViewController: DiffableViewController {
override func viewDidLoad() {
super.viewDidLoad()
reload()
}
@CollectionViewBuilder
override var sections: [any CollectionSection] {
List {
Label("Hello DiffableUI!")
}
}
}
DiffableUI 的构建基块是 CollectionItem
和 CollectionSection
。 CollectionItem
代表你可能想要在 UICollectionView
上显示的任何单元格,而 CollectionSection
则持有你的 item 并知道如何在视图上布局它们。
创建你自己的 item 很简单,你只需要提供一个标识符、一种持有你的模型的方式、一个重用标识符以及一种使用你的模型配置你的单元格的方式
public struct Empty: CollectionItem {
public init() {}
public var id: AnyHashable { item.id }
public var item = EmptyHashable()
public var reuseIdentifier: String { "empty" }
public func configure(cell: UICollectionViewCell) {}
public struct EmptyHashable: Hashable {
let id = UUID()
}
}
对于稍微更复杂的 DiffableUI 用法,请查看我们的 Hacker News 示例应用,我们在其中获取最新新闻并使用自定义的 CollectionItem
显示它们。
DiffableUI 的构建考虑了类似 SwiftUI 的可扩展性。 使用库的扩展来添加功能
@CollectionViewBuilder
override var sections: [any CollectionSection] {
List {
Label("Hello DiffableUI!")
.onTap {
print("Hello, console!")
}
}
}
或者通过直接扩展 CollectionItem
或其具体实现来创建你自己的扩展
extension Label {
func largeRedTitle() -> Self {
self
.fontStyle(.largeTitle)
.textColor(.red)
}
}
要创建一个新的 CollectionSection
,你必须提供一个标识符、某种持有 [any CollectionItem]
的方式,并提供一个返回 NSCollectionLayoutSection
的函数。 查看 List 以获取更多详细信息。
你可以通过使用 Xcode 文件菜单中的 “Add Package Dependencies” 选项将 DiffableUI 添加到你的项目中,或者将其作为依赖项添加到你的 Package.swift 文件中,如下所示
dependencies: [
.package(url: "https://github.com/loloop/DiffableUI",from: Version(0, 0, 1)),
],
要贡献代码,只需打开一个 pull request,让我们从那里开始 :) 这里有一些建议
此库在 MIT 许可证下发布。 有关详细信息,请参阅 LICENSE。