动态架构和集合视图
在本文中,我将主要讨论UICollectionView,但它也将与UITableView一起使用。
主要问题
UICollectionView的最大问题之一是单元,控制器和模型之间的依赖关系。
如果架构不好,则所有内容都在控制器中,很难更改任何内容。
但是,UICollectionView的目标是显示具有不同设计和数据的UICollectionViewCell。
解
解决方案之一是使用MVVM软件架构模式,如果您不知道它是什么,可以在此处学习一些技巧。
让我们看一个具体的示例,该示例说明并显示如何解决上面看到的问题。
该项目显示一个简单的集合视图,该视图显示具有不同设计的电影列表和一些广告。 ($$$$)
您可以在此处找到该项目。
建筑
如您所见,这里不仅包含ViewController和单元,而且由于每个类的职责也将更加清楚!
我将逐一解释每个班级的责任。
视图模型
这个ViewModel的目的是通过遵守UICollectionViewDataSource协议来告诉控制器它必须显示什么以及何时必须通过ViewModelDelegate显示它。
在我们的项目中,ViewModel将提供要显示在UICollectionView中的项目列表。
首先,我们调用viewModelDidStartLoad委托方法以在屏幕上显示加载程序或任何内容。
然后,我们添加项目并调用viewModelDidLoad委托方法以刷新屏幕。
ViewController
通常,每个控制器都有一个ViewModel。
惰性变量viewModel:ViewModel = ViewModel(委托:self)
ViewController实现UICollectionViewDelegate和自定义ViewModelDelegate 。
当数据准备好显示时,此类必须遍历所有项并将它们注册到collectionView中,如您所见:
CellItem
每个项目都处理一个单元格,并且必须遵守协议CellItem。
如您在上面看到的,该项目必须:
- 知道重用标识符
- 了解XIB来加载单元
- 配置单元(显示数据)
- 知道细胞的大小
- 将单元格注册到集合视图
通常, register和cellNib方法总是相同的,因此我们可以创建协议的扩展以具有默认实现。
MovieCellItem
让我们看一个带有MovieCellItem的更具体的例子。
在此类中,我们有一种类型可以帮助我们加载特定的XIB,但是CellItem协议的实现非常简单。
如果您必须处理单元内部的特定交互,则最好在项目中进行。
例如,该项目可以是单元格拥有的UITextField的委托,并通过特定协议,数据块或您喜欢的任何数据将数据直接传递到ViewController或ViewModel 。
细胞
细胞几乎什么都不做!
它们仅具有IBOutlet,并可以根据需要在aakeakeNib()或prepareForReuse()方法中自定义设计。
MovieCell类:UICollectionViewCell {
@IBOutlet弱var imageView:UIImageView!
@IBOutlet弱var titleLabel:UILabel!
}
结论
该体系结构的目标是获得一个模块化的屏幕,并且可以动态更新屏幕。
例如,如果您必须解析一个JSON,该JSON返回电影列表,其中每个电影都有一个特定的设计模板:您可以使用上面学到的内容!
此外,如果必须将新的单元格添加到集合视图中,则只需要:
- 修改ViewModel类中的方法addItems() 。
- 创建一个新的CellItem
- 创建一个新的Cell及其XIB
我们称之为可扩展性 ,您可以在这里找到更多。
我使用这种架构已有一段时间,每天使用它时,我看到了更多期望的专业人士。
优点:
- 更可测试
- 更干净
- 更易懂且易于维护
- 没有相互依赖
- 生产力更高:每个团队成员都可以处理特定的单元/项目
给我留言,告诉我您的解决方案是什么,我将如何改进我的解决方案!