为什么?
作为移动开发者,我们都要处理数据显示集合。但这真的总是那么简单吗?
看起来像是意大利面?这样的情况很常见,应用程序显示数据/占位符(这可能会根据例如加载数据状态的不同而有所不同),我们中的一些人结束了定义状态和混乱的一切。
Stefan 是一个框架,它帮助你在集合视图中管理状态。基本上它是数据源和视图本身之间的中间商。当然,它支持内置的UITableView和UICollectionView,但决定你的 ReloadableView 和 PlaceholderView 是你的事。它包含了在加载数据集合时可能出现的最常见的状态。
基本设置
- 定义
Stefan
对象,最佳方案是为每个ReloadableView
定义一个Stefan
。 - 连接 Stefan 的
reloadableView
和placeholderPresenter
(二者可能都是nil
)。
请记住:实现 LoadableStatePlaceholderPresentable 的类必须有一个对占位符视图的 弱引用。
- 调用
stefan.load(newState: ...)
设置示例
private func setupStefan() {
viewModel.stefan.reloadableView = self.tableView
viewModel.stefan.placeholderPresenter = self
viewModel.stefan.load(newState: .noContent) // initial state
}
为了读取当前项,请调用
try stefan.state.items()
关于占位符的一些话
- 我们已经尽力使其尽可能灵活,因此您可以提供自定义的占位符视图,该视图应遵循
LoadableStatePlaceholderView
并实现ItemsLoadableStateBindable
协议。要显示自定义占位符视图,只需实现由 Stefan 的placeholderPresenter
处理的功能customPlaceholderView
的自身版本。
定制示例
public func customPlaceholderView() -> LoadableStatePlaceholderView {
let view = LoadingPlaceholderView.instanceFromNib()
view.dataSource = self.viewModel
return view
}
- 此外,还提供了一个由标题、副标题和活动指示器组成的默认占位符视图,也许对您也有帮助。请随意查看示例项目中它是如何工作的。
闭包
为了使 Stefan 充分通用,我们提供了常见的闭包模式委托。以下是一些可用的委托闭包
public var shouldReload: ((ReloadableView!) -> Bool)
public var didChangeState: ((ItemsLoadableState<ItemType>) -> Void)
public var shouldDisplayPlaceholder: ((ItemsLoadableState<ItemType>) -> Bool)
不同的
Stefan 提供了差分函数的默认实现,其结果应为 ItemReloadingResult
。该结果告诉 Stefan 应该重新加载什么(或者也许对他来说没有什么可做的)。您可以通过定义来提供自己的实现
stefan.statesDiffer = ...
请注意,这是一个弱对象,您必须处理保留它。
Stefan 有一个 Differ
依赖项,这在比较时执行集合的快速操作时是必需的。初始化 Stefan 时,您可以提供重新加载类型,可能是 animated
或 basic
。默认情况下,动画是禁用的,但当你启用它时,Stefan 将自动由自己处理集合动画。
RxStefan
我们为 Stefan 添加了一些 RxSwift 扩展,请根据 此存储库 进行操作。
Carthage
请在您的 Cartfile 中添加以下条目
github "appunite/Stefan"
然后运行 carthage update
。
Cocoapods
请在您的 Podfile 中添加以下条目
pod 'Stefan'
然后运行 pod install
。
已知的已知问题
• 尚无问题
贡献
本项目由 Piotr Bernad 和 Szymon Mrozek 创立和维护。
我们需要您的帮助来报告或修复错误。我们也希望听到您关于功能建议的意见。如果您有想法让 Stefan 更好,请随时向我们发送 Pull Request。
许可证
Stefan 采用 MIT 许可证发布。更多信息请参阅 License.md。