视图是否应包含其显示的模型?

时间:2017-10-24 15:43:24

标签: model-view-controller view model

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

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

在(1)中,它违反了MVC设计模式,其中View不直接与Model交谈,而View也可以调用Model方法

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

还有另外一种方法,使用ViewModel来包装模型以处理UI逻辑,但这将创建许多类,每次我获得模型列表时,我还必须将其映射到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
}

1 个答案:

答案 0 :(得分:0)

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

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