在与其他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模式冲突吗?
答案 0 :(得分:3)
这与您编写面向对象代码时做出的任何其他决定没有什么不同。代码应放在它所属的位置。
您有自定义单元格。该自定义单元格应该比使用它的任何视图控制器更了解自己。自定义单元格应该是基于视图控制器(实际上是表视图的数据源)提供给单元格的数据和状态信息来创建和设置自己的子视图的主类。
人们用cellForRow
填充过多的单元格设置代码是很常见的。这是一种不好的做法。细胞是一个视图。视图负责根据需要进行自我设置。数据源(控制器)应该只给出单元数据和状态,然后单元应该相应地配置它自己。
cellForRowAt
)是设置单元格颜色的好地方。
在简单的情况下,在cellForRowAt
中添加几行来设置颜色和标题。
在更复杂的情况下,单元格显示图像,多个文本值,并且布局更复杂,cellForRowAt
应该将数据传递给单元格,单元格应该执行所有复杂的布局。这将细胞结构的知识移动到它所属的细胞。
考虑iOS SDK提供的其他视图类,您不直接设置子视图属性。示例包括UIAlertController/UIAlertAction
,UITextField
和其他许多内容。您在这些视图上设置属性,并且视图相应地更新自身。以类似的方式处理表格视图单元格。