gpt4 book ai didi

ios - UICollectionView 和 MVVM

转载 作者:IT王子 更新时间:2023-10-29 05:53:12 27 4
gpt4 key购买 nike

我试图了解如何使用 MVVM 开发可重用的 UICollectionViewController

假设您为每种类型的 UICollectionViewCell 创建一个 View 模型

struct CollectionTestCellViewModel {
let name: String
let surname: String

var identifier: String {
return CollectionTestCell.identifier
}

var size: CGSize?
}

和细胞:

class CollectionTestCell: UICollectionViewCell {
@IBOutlet weak var surnameLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!

func configure(with viewModel: CollectionTestCellViewModel) {
surnameLabel.text = viewModel.surname
nameLabel.text = viewModel.name
}
}

在 View Controller 中我有类似的东西:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let viewModel = sections[indexPath.section][indexPath.row]
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: viewModel.identifier, for: indexPath)
configure(view: cell, with: viewModel)
return cell
}

到目前为止没有问题。但是现在考虑 UICollectionViewDelegateFlowLayout 的这个方法:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let viewModel = sections[indexPath.section][indexPath.row]
return viewModel.size ?? UICollectionViewFlowLayoutAutomaticSize
}

关键是我在 View 模型中有布局信息(单元格的大小)。这允许我在我的 View Controller 中放置布局委托(delegate)方法,但我不知道这是否违反了 MVVM 模式。

最后一个问题是:我应该在 View 模型(例如单元格)中放入什么? “允许”将布局数据放入 View 模型中?

谢谢

最佳答案

在 MVVM 中, View 由仅视觉元素组成。我们只做布局、动画、初始化 UI 组件等事情。在 View 和 Model 之间有一个特殊的层,称为 ViewModel。

ViewModel 提供一组接口(interface),每个接口(interface)代 TableView 中的一个 UI 组件。我们使用一种称为“绑定(bind)”的技术将 UI 组件连接到 ViewModel 接口(interface)。因此,在 MVVM 中,我们不直接接触 View ,我们在 ViewModel 中处理业务逻辑,因此 View 会相应地改变自身。

我们在 ViewModel 而不是 View 中编写表现性的东西,例如将 Date 转换为 String

因此,可以在不知道 View 实现的情况下为表示逻辑编写更简单的测试。

了解有关 iOS 中 MVVM 的更多信息 read this article .

关于ios - UICollectionView 和 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49037096/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com