如今,我们在iOS中遇到问题。 代替代表模型视图控制器的MVC设计模式,我们有一种叫做Massive-View-Controller的疾病。
作为一项出色的“重构技能”,我们迅速采用了MVVM(模型-视图-视图模型)设计模式。 确实很好,这是毫无疑问的,但是让我们看一下iOS内部最常见的错误之一-精确地使用cell, UITableViewCell和UICollectionViewCell ,以及我们发现自己被“大规模”病毒感染的原因。
假设我们要在集合视图中展示用户:
struct用户{ 变量名称:字符串 var imageUrl:字符串 }
我们这样定义集合视图单元格:
类UserCollectionViewCell:UICollectionViewCell { @IBOutlet弱var nameLabel:UILabel! @IBOutlet弱var profileImageView:UIImageView! }
在具有集合视图的视图控制器内部,我们将具有:
类UsersViewController:UIViewController { var users = [ 用户(名称:“ Djuro”,imageUrl:“ some_url”), 用户(名称:“ Alfirevic”,imageUrl:“ some_other_url”) ]
}
扩展UsersViewController:UICollectionViewDataSource { func numberOfSections(在collectionView:UICollectionView中)-> Int { 返回1 }
func collectionView(_ collectionView:UICollectionView,numberOfItemsInSection部分:Int)-> Int { 返回users.count }
func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { 让单元格= collectionView.dequeueReusableCell(withReuseIdentifier:“ UserCell”,for:indexPath)为! UserCollectionViewCell 让用户=用户[indexPath.row]
cell.nameLabel.text =用户名
cell.profileImageView.loadImageFrom(user.imageUrl) 返回单元 } }
那里,我们有一个问题。 三行代码,而不只是一行。 假设我们添加了descriptionLabel和dateLabel 。 添加了两行代码。 所以是五行而不是一行。
一个人会说为什么? 为什么会有问题呢? 没什么大不了吧?
让我们考虑一下:我是一个视图控制器,并且有一个集合视图。 当然,我知道我的收藏视图中有一些单元格-但是,我不在乎这些单元格中将要呈现的内容。 我为什么要在乎? 配置集合视图单元完全不是我的工作! 确实,必须进行良好的分解!
让我们看看如何解决此问题:
类UserCollectionViewCell:UICollectionViewCell { @IBOutlet私有弱变量nameLabel:UILabel! @IBOutlet私有弱var profileImageView:UIImageView! var用户:用户! { didSet { nameLabel.text =用户名
profileImageView.loadImageFrom(user.imageUrl)
descriptionLabel.text = user.shortBio
dateLabel.text = user.dateOfBirth } } }
首先,为什么我们宣布我们的网点为私人网点-嗯,实际上没有人知道它们。 使用此单元的任何人都应该知道,它只需要为用户和单元提供相应的配置即可。
让我们看看我们的“感染”视图控制器:
func collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)-> UICollectionViewCell { 让单元格= collectionView.dequeueReusableCell(withReuseIdentifier:“ UserCell”,for:indexPath)为! UserCollectionViewCell cell.user = users [indexPath.row] 返回单元 }
你怎么看? 在某个时候,我们用一些新的标签,按钮,图像视图更新了单元格,但是视图控制器会说: “嘿,单元格,我不在乎,这里是您的用户对象,可以根据需要配置自己。”因此,逐步地,我们在视图控制器中的代码最终将变得更小-您知道一个“更少的代码,更少的错误” 。
此外,还有更多示例完全不涉及我们的视图控制器,我将覆盖这些示例。 这就是为什么MVVM首先具有如此强大的设计模式的原因。
编码愉快!