所以我认为有几种可能性。以下是我尝试处理几乎类似情况的方法,希望对您的思考有所帮助。
首先,我为我的 Viewmodels 创建协议。例如:
protocol Child1ViewProtocol {
func getFirstName () -> String
}
protocol Child2ViewProtocol {
func getLastName () -> String
}
protocol MainViewProtocol {
func getChildModel1 () -> Child1ViewProtocol
func getChildModel2 () -> Child2ViewProtocol
func getLanguage () -> String
func saveButtonPressed ()
}
然后我创建我的 ViewModel 类。这是给孩子的,很简单:
class Child1ViewModel: Child1ViewProtocol {
var firstName: String?
init(firstName: String?) {
self.firstName = firstName
}
func getFirstName () -> String {
return self.firstName ?? ""
}
}
class Child2ViewModel: Child2ViewProtocol {
var lastName: String?
init(lastName: String?) {
self.lastName = lastName
}
func getLastName () -> String {
return self.lastName ?? ""
}
}
我的 MainViewModel 保留了子模型,以便在调用 saveButtonPressed 函数时可以访问它们
class MainViewModel: MainViewProtocol {
var user: User?
var child1ViewModel: Child1ViewProtocol!
var child2ViewModel: Child2ViewProtocol!
init(child1ViewModel: Child1ViewProtocol,
child2ViewModel: Child2ViewProtocol) {
self.child1ViewModel = child1ViewModel
self.child2ViewModel = child2ViewModel
}
func getChildModel1 () -> Child1ViewProtocol {
return self.child1ViewModel
}
func getChildModel2 () -> Child2ViewProtocol {
return self.child2ViewModel
}
func getLanguage () -> String {
return self.user?.language ?? ""
}
func saveButtonPressed () {
self.user?.firstName = self.child1ViewModel.getFirstName()
self.user?.lastName = self.child2ViewModel.getLastName()
// And save the user for example
}
}
这意味着当您在 Coordinator 中创建 MainViewModel 时,您也需要创建 childViewModel 并将它们注入 MainViewModel。这也意味着您不需要在视图中对 childViewModel 进行强引用。