所以我認爲有幾種可能性。以下是我如何管理幾乎類似的情況,我希望它能幫助你進行思考。
首先我爲我的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有強烈的引用。