だから、いくつかの可能性があると思います。ここで私はほとんど似たような状況を管理しようとしています、私はあなたの思考にあなたを助けることを願っています。
まず、自分の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クラスを作成します。ここでは、子供のために非常に簡単です:
機能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を作成するときに意味し、それらにアクセスできるように、子モデルを保持
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コーディネーターでchildViewModelも作成し、MainViewModelに注入する必要があります。つまり、ビュー内のchildViewModelに強い参照を持つ必要はありません。