为什么在cellForItemAt中设置单元格属性不好?

时间:2018-03-08 20:32:54

标签: ios uitableview uicollectionview

在与其他iOS开发者的会面中,我无意中听到了在cellForItemAt中设置视图属性的批评(例如背景颜色,图像,标签等),因为这是“做错的方法”。

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let headerCell = calendarCollectionView.dequeueReusableCell(withReuseIdentifier: "cellId", for: indexPath) as! CustomCell
    cell.backgroundColor = .red
    cell.titleLabel = "This is my text"
    return cell
}

我知道设置视图属性的正确方法是在自定义单元格文件中执行此操作,但我不确定在此处执行此操作与自定义单元格文件之间的区别。如果代码行为相同,有什么区别,为什么这是“错误的方法”呢?是因为这与MVC模式冲突吗?

1 个答案:

答案 0 :(得分:3)

这与您编写面向对象代码时做出的任何其他决定没有什么不同。代码应放在它所属的位置。

您有自定义单元格。该自定义单元格应该比使用它的任何视图控制器更了解自己。自定义单元格应该是基于视图控制器(实际上是表视图的数据源)提供给单元格的数据和状态信息来创建和设置自己的子视图的主类。

人们用cellForRow填充过多的单元格设置代码是很常见的。这是一种不好的做法。细胞是一个视图。视图负责根据需要进行自我设置。数据源(控制器)应该只给出单元数据和状态,然后单元应该相应地配置它自己。

尽管如此,自定义单元视图也可能有点通用,并且不同的控制器可能希望单元看起来不同。一个很好的简单示例是问题中的代码。该控制器希望单元格具有红色背景。但是另一个控制器可能使用相同的细胞类但需要蓝色背景。对于像这样的简单情况,控制器(cellForRowAt)是设置单元格颜色的好地方。

在简单的情况下,在cellForRowAt中添加几行来设置颜色和标题。

在更复杂的情况下,单元格显示图像,多个文本值,并且布局更复杂,cellForRowAt应该将数据传递给单元格,单元格应该执行所有复杂的布局。这将细胞结构的知识移动到它所属的细胞。

考虑iOS SDK提供的其他视图类,您不直接设置子视图属性。示例包括UIAlertController/UIAlertActionUITextField和其他许多内容。您在这些视图上设置属性,并且视图相应地更新自身。以类似的方式处理表格视图单元格。