动态架构和集合视图

在本文中,我将主要讨论UICollectionView,但它也将与UITableView一起使用。

主要问题

UICollectionView的最大问题之一是单元,控制器和模型之间的依赖关系。

如果架构不好,则所有内容都在控制器中,很难更改任何内容。

但是,UICollectionView的目标是显示具有不同设计和数据的UICollectionViewCell。

解决方案之一是使用MVVM软件架构模式,如果您不知道它是什么,可以在此处学习一些技巧。

让我们看一个具体的示例,该示例说明并显示如何解决上面看到的问题。

该项目显示一个简单的集合视图,该视图显示具有不同设计的电影列表和一些广告。 ($$$$)

您可以在此处找到该项目。

建筑

如您所见,这里不仅包含ViewController和单元,而且由于每个类的职责也将更加清楚!

我将逐一解释每个班级的责任。

视图模型

这个ViewModel的目的是通过遵守UICollectionViewDataSource协议来告诉控制器它必须显示什么以及何时必须通过ViewModelDelegate显示它。

在我们的项目中,ViewModel将提供要显示在UICollectionView中的项目列表。

视图模型的简单实现示例

首先,我们调用viewModelDidStartLoad委托方法以在屏幕上显示加载程序或任何内容。

然后,我们添加项目并调用viewModelDidLoad委托方法以刷新屏幕。

ViewController

通常,每个控制器都有一个ViewModel。

 惰性变量viewModel:ViewModel = ViewModel(委托:self) 

ViewController实现UICollectionViewDelegate和自定义ViewModelDelegate

ViewModelDelegate实现的示例

当数据准备好显示时,此类必须遍历所有项并将它们注册到collectionView中,如您所见:

通过项目在集合视图上注册单元格

CellItem

每个项目都处理一个单元格,并且必须遵守协议CellItem。

单元项协议

如您在上面看到的,该项目必须:

  • 知道重用标识符
  • 了解XIB来加载单元
  • 配置单元(显示数据)
  • 知道细胞的大小
  • 将单元格注册到集合视图

通常, register和cellNib方法总是相同的,因此我们可以创建协议的扩展以具有默认实现。

MovieCellItem

让我们看一个带有MovieCellItem的更具体的例子。

在此类中,我们有一种类型可以帮助我们加载特定的XIB,但是CellItem协议的实现非常简单。

如果您必须处理单元内部的特定交互,则最好在项目中进行。

例如,该项目可以是单元格拥有UITextField的委托,并通过特定协议,数据块或您喜欢的任何数据将数据直接传递到ViewControllerViewModel

细胞

细胞几乎什么都不做!

它们仅具有IBOutlet,并可以根据需要在aakeakeNib()prepareForReuse()方法中自定义设计。

  MovieCell类:UICollectionViewCell { 
  @IBOutlet弱var imageView:UIImageView! 
  @IBOutlet弱var titleLabel:UILabel! 
  } 

结论

该体系结构的目标是获得一个模块化的屏幕,并且可以动态更新屏幕。

例如,如果您必须解析一个JSON,该JSON返回电影列表,其中每个电影都有一个特定的设计模板:您可以使用上面学到的内容!

此外,如果必须将新的单元格添加到集合视图中,则只需要:

  • 修改ViewModel类中的方法addItems()
  • 创建一个新的CellItem
  • 创建一个新的Cell及其XIB

我们称之为可扩展性 ,您可以在这里找到更多。

我使用这种架构已有一段时间,每天使用它时,我看到了更多期望的专业人士。

优点:

  • 更可测试
  • 更干净
  • 更易懂且易于维护
  • 没有相互依赖
  • 生产力更高:每个团队成员都可以处理特定的单元/项目

给我留言,告诉我您的解决方案是什么,我将如何改进我的解决方案!