【问题标题】:Should a View contain the Model it present?视图是否应该包含它呈现的模型?
【发布时间】:2018-04-05 12:01:34
【问题描述】:

在 MVC 模式中,视图是否应该包含它所呈现的模型?

例如,我有一个 Item 模型,ItemsListView 和 ItemRowView 来显示它。 为了显示列表,我应该将 Item 模型传递给 ItemRowView (1) 还是可以将 Item.title、Item.details、Item.image 等传递给 ItemRowView (2)

在(1)中,违反了MVC设计模式,View不直接与Model对话,View也可以调用Model方法

在(2)中,当使View dummy时,如果在另一个ViewController中,我们使用ItemsList获得增益,我们必须再次复制传递的参数,如果我们需要向用户传递更多的属性会发生什么?

还有另一种方式,使用 ViewModel 包裹 Model 来处理 UI Logic,但这会创建很多类,并且每次我得到一个模型列表时,我还必须将它映射到 ViewModels

示例:

class ItemModel {
  var name: String = ""
  var price: Double = 9000
}

我是否应该像这样将模型分配给 UITableViewCell:(这样单元格可以在新数据到来时自行更新数据)

class ItemTableViewCell: UITableViewCell {

  @IBOutlet var titleLabel: UILabel!

  var item: ItemModel! {
    didSet {
      self.updateUI()
    }
  }

  func updateUI() {
    titleLabel.text = item.name
  }
}

或者我应该保持单元格虚拟,并在 ViewController 中更新 UI:

class ItemTableViewCell: UITableViewCell { 
  @IBOutlet var titleLabel: UILabel!   
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell: ItemTableViewCell = tableView.dequeueReusableCell(withIdentifier: "ItemTableViewCell", for: indexPath)

  var item = items[indexPath.row]
  cell.titleLabel.text = item.name

  return cell
}

【问题讨论】:

  • 你能给出代码示例吗?我不确定我是否完全理解你的例子......
  • 您好,很抱歉这个问题。我已经更新了

标签: model-view-controller view model


【解决方案1】:

是的。因为它使您能够使用模型本身的基本方法,而不是创建包装类和处理基于设计更改的转换。

如今的经验法则是,如果该视图需要多个对象,则每个视图都有一个视图模型。这使您可以在不接触控制器的情况下处理设计和数据更改。

【讨论】:

    猜你喜欢
    • 2012-11-16
    • 2011-11-07
    • 2013-05-07
    • 2023-02-10
    • 2012-01-17
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多