DiffableUI

DiffableUI 是一组构建于 UICollectionViewCompositionalLayout 和 UICollectionViewDiffableDataSource 之上的包装器和助手,旨在帮助你在 UIKit 世界中编写简洁、可重用且类似 SwiftUI 的代码。

如何使用

要使用 DiffableUI,你必须创建一个继承自 DiffableViewControllerUIViewController,重写 sections 计算变量,并在你想要视图重新计算时调用 reload(),如下所示

final class ExampleViewController: DiffableViewController {
  override func viewDidLoad() {
    super.viewDidLoad()
    reload()
  }

  @CollectionViewBuilder
  override var sections: [any CollectionSection] {
    List {
      Label("Hello DiffableUI!")
    }
  }
}

自定义

DiffableUI 的构建基块是 CollectionItemCollectionSectionCollectionItem 代表你可能想要在 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