【发布时间】:2017-10-04 13:28:28
【问题描述】:
假设我有一个模型 Car,它在 ViewModel1 中实例化,具有以下初始属性:
ViewModel1
let car = Car(make: "McLaren", model: "P1", year: 2015)
然后我需要在下一个视图控制器中完成汽车的附加信息。跟随 MVVM 时,在视图控制器之间传递模型的正确方法是什么?
使用 MVC,操作很简单,因为视图可以引用模型:
vc2.car = car
以下是对该问题的伪尝试,但是我的印象是视图模型应该是私有的,并且只能由单个视图控制器访问。因此,以下尝试对我来说似乎不正确。
ViewController1
fileprivate let viewModel = ViewModel1()
func someMethod() -> {
let car = self.viewModel.car
let vc2 = ViewController2()
vc2.viewModel.car = car
present(vc2, animated: true, completion: nil)
}
ViewController2
let viewModel = ViewModel2()
func anotherMethod() {
print(self.viewModel.car.make) //prints "McLaren"
viewModel.manipulateCar() //adds additional information to the car object
print(self.viewModel.car.color) //prints "Black"
//Pass the finished car to the last view controller to display a summary
let vc3 = ViewController3()
vc3.viewModel.car = self.viewModel.car
}
我想知道我上面展示的是否是使用 MVVM 时做事的好方法,或者如果不是,那么在视图控制器之间传递汽车的最佳方法是什么?
编辑
这个问题与 Class vs Struct 无关。上面的 MVC 示例暗示它将成为一个类(因为它是一个引用)并且它正在多个视图控制器之间传递以完成对象的更多部分。
在跟随MVVM时如何在视图控制器之间传递模型以及视图模型是否应该对视图控制器私有是一个问题。
对于 MVVM,视图控制器不应该引用模型,因此不应该有变量 var car: Car?。因此,您不应该看到:
let vc2 = ViewController2()
vc2.car = car
看到这个会不正确吗?
let vc2 = ViewController2()
vc2.viewModel.car = car
【问题讨论】:
-
我没有看到任何
reactive的东西,有吗?标签可能令人困惑