[英]Passing data to an existing view model in MVVM-C pattern on iOS
[英]Passing data between ViewModels in MVVM-C
我正在使用带协调器的 MVVM 来设计应用程序。 我怀疑的一件事是如何在不同的ViewModels
之间传递数据。 通常前一个 viewModel 只会创建下一个 viewModel 并且只会在prepareforsegue
中进行方法依赖注入。 但是,既然我负责所有导航,我该如何实现呢?
Class AppCoordinator : NSObject, Coordinator, UINavigationControllerDelegate {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
var dependencyContainer : MainDependencyContainer
func start() {
let vc = ViewController.instantiate()
vc.coordinator = self
vc.viewModel = dependencyContainer.makeMainViewModel()
navigationController.delegate = self
navigationController.pushViewController(vc, animated: true)
}
func createAccount() {
let vc = CreateAccountViewController.instantiate()
vc.coordinator = self
navigationController.pushViewController(vc, animated: true)
}
}
我当然可以在MainViewModel
中为CreateAccountViewController
创建ViewModel
,并将ViewModel
作为参数传递到createAccount
方法中,但这是正确的方法吗? 这里的单元测试意味着什么?
理想情况下,您不希望两个 ViewModel 相互交互并将两个元素分开。
处理它的一种方法是传递导航所需的最少数据。
class AppCoordinator : NSObject, Coordinator, UINavigationControllerDelegate {
var childCoordinators = [Coordinator]()
var navigationController: UINavigationController
var dependencyContainer : MainDependencyContainer
func start() {
let vc = ViewController.instantiate()
vc.coordinator = self
let viewModel = dependencyContainer.makeMainViewModel()
// for specific events from viewModel, define next navigation
viewModel.performAction = { [weak self] essentialData in
guard let strongSelf = self else { return }
strongSelf.showAccount(essentialData)
}
vc.viewModel = viewModel
navigationController.delegate = self
navigationController.pushViewController(vc, animated: true)
}
// we can go further in our flow if we need to
func showAccount(_ data: AnyObject) {
let vc = CreateAccountViewController.instantiate()
vc.viewModel = CreateAccountViewController(with: data)
vc.coordinator = self
navigationController.pushViewController(vc, animated: true)
}
}
更进一步,您可以为CreateAccountViewController
创建一个特定的协调器,它将使用这些数据进行初始化。 start()
方法将创建其 ViewController 所需的任何内容。
// we can go further in our flow if we need to
func showAccount(_ data: AnyObject) {
let coordinator = CreateAccountCoordinator(data: data, navigationController: navigationController)
coordinator.start()
childCoordinators.append(coordinator)
}
在最后一个示例中,协调器仅负责构建其视图并在需要时将基本信息传递给下一个协调器。 viewModel 只暴露给它的视图,最终视图并不知道这两者。 在您的情况下,这可能是一个不错的选择。
最后,您可以使用协议抽象进行测试,以确保performAction
触发showAccount
, showAccount
创建一个子协调器,等等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.