让我们来谈谈细胞宝贝!

如今,我们在iOS中遇到问题。 代替代表模型视图控制器的MVC设计模式,我们有一种叫做Massive-View-Controller的疾病。

作为一项出色的“重构技能”,我们​​迅速采用了MVVM(模型-视图-视图模型)设计模式。 确实很好,这是毫无疑问的,但是让我们看一下iOS内部最常见的错误之一-精确地使用cell, UITableViewCellUICollectionViewCell ,以及我们发现自己被“大规模”病毒感染的原因。

假设我们要在集合视图中展示用户:

  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) 

返回单元
}
}

那里,我们有一个问题。 三行代码,而不只是一行。 假设我们添加了descriptionLabeldateLabel 。 添加了两行代码。 所以是五行而不是一行。

一个人会说为什么? 为什么会有问题呢? 没什么大不了吧?

让我们考虑一下:我是一个视图控制器,并且有一个集合视图。 当然,我知道我的收藏视图中有一些单元格-但是,我不在乎这些单元格中将要呈现的内容。 我为什么要在乎? 配置集合视图单元完全不是我的工作! 确实,必须进行良好的分解!

让我们看看如何解决此问题:

 类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首先具有如此强大的设计模式的原因。

编码愉快!