所以我认为有几种可能性。以下是我如何管理几乎类似的情况,我希望它能帮助你进行思考。
首先我为我的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
}
}
当您创建MainViewModel这意味着在您的协调器中,您还需要创建childViewModels并将它们注入到MainViewModel中。这也意味着您不需要在视图中对childViewModels有强烈的引用。