MVVM实现UICollectionView的方法-第4部分

单元中的用户交互。

如果您对示例项目感兴趣,那么PowerTools是一个小框架,我正在构建这些框架,应用这些文章中介绍的所有策略,然后在您的计算机上进行尝试,只需在bash终端上尝试PowerTools

在这里您可以找到以前的部分:

  • 第1部分-使您的内容独立
  • 第2部分-增强ViewModel和单元的可重用性
  • 第3部分-使用UICollectionFlowLayout的单元格大小

互动,滚动和委派

正如我们在第3部分中所看到的,UICollectionViewDelegate与UICollectionViewDataSource一起在我们的DataSource类中。 这是因为UICollectionViewDelegate具有很多功能:

  • 定义单元格的大小
  • 响应用户与单元的交互
  • UICollectionViewUIScrollViewDelegate 吗?

但是通常我想分别定义和管理那些行为,以遵守单一责任原则。 为此,我应用了Jesse Squires在本文中描述的技术,在数据源上定义了两个委托:InteractionDelegate和UIScrollViewDelegate。 所有这些方法都将代理给委托,可以单独实现这些委托并将行为注入到DataSource中。

我的假设是:ViewController,您将在迭代呈现的业务资源上呈现劣势。 如果为真,则每个项目都有一个要呈现的特定UIViewController或定义该项目需要呈现哪个UIViewController的相关逻辑。

同时, UIViewControllers需要定义上下文,通常这些信息不依赖业务资源,而是直接从UIViewControllerUIViewController

基于这些假设,我可以定义一个Builder,他是唯一知道如何构造目标UIViewController的Builder 它将包含与构建UIViewController所需的业务资源相关的所有信息,并从工厂接收要注入的上下文。

带有字符串的示例构建器。

我定义了在应用程序级别在PowerTools框架中通用的Context ,通常将其用于依赖注入。 Factory是一个协议,因此可以从需要它的每个对象中实现它,并将上下文注入到Builder中,因此一切都是类型安全的。

在PowerTools中声明的AbstractFactory

观看AbstractFactory的实现,我们可以看到一个新的接口,该接口以前从未知道过,但是它的名称应该很清楚: BuilderContainer。 这是启用类型擦除的层:

很简单,但是像个魔术

类型擦除是一个复杂的论点,如果您有兴趣深入了解,建议您从NatashaTheRobot的本文开始。

FastForward,这是我在ItemViewModels中应用typeErasure的方式:

ItemViewModel如何将构建器传递到其交互工厂

此代码段中的重要部分是ColorItemViewModel扩展,其余的仅用于提供有关正在应用的内容的上下文。

因此,现在我们只需要将Interaction委托绑定到AbstractFactory即可使其像黑魔法一样工作,并且要做到这一点,使用条件扩展的解决方案非常简单:

合并AbstractFactory行为的InteractionDelegate条件扩展

结论

我大量使用这些模式来增强应用程序中的代码可重用性和责任封装,因此,如果您发现此提示很方便或有增强的想法,请提示我或向PowerTools提出拉取请求

Interesting Posts