2017-10-19 176 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類。這裏是孩子,很容易:

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有強烈的引用。