2017-10-19 9 views
0

MVVMアーキテクチャを使用しているため、かなり複雑なビューが作成されています。そのため、ビューを別々のクラスに分割して、それぞれ別々のビューモデルを使用することにしましたコンポーネントを表示します。私はコーディネーター(基本的にはMVVMC)も使用しています。私はコーディネータを使ってビューコントローラをセットアップし、ビューモデルを作成して、メインビューのIBOutletsからアクセス可能な別々のビューコンポーネントに注入します。複雑なモデル構造を持つMVVMを使用する

私の問題は、CoreDataを使用していて、複数のリレーションシップを持つ単一のNSManagedObjectを保存しようとしていますが、リレーションシップモデルは、別のビューコンポーネントに接続されている他のビューモデルでのみ利用できます。保存ボタンがメインビューからタップされたときに、ViewControllerが所有するメインビューモデルに他のビューモデルのリレーションシップモデルを与えるきれいな方法はありますか?または、他のビューモデルに保存ボタンがタップされたことを伝えるために、委任パターンを使用することを考えていなければなりませんか?

答えて

1

だから、いくつかの可能性があると思います。ここで私はほとんど似たような状況を管理しようとしています、私はあなたの思考にあなたを助けることを願っています。

まず、自分の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に強い参照を持つ必要はありません。

関連する問題