Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 使用具有复杂模型结构的MVVM_Swift_Core Data_Mvvm_Delegates - Fatal编程技术网

Swift 使用具有复杂模型结构的MVVM

Swift 使用具有复杂模型结构的MVVM,swift,core-data,mvvm,delegates,Swift,Core Data,Mvvm,Delegates,因此,我使用MVVM体系结构,构建了一个相当复杂的视图,因此我决定将视图拆分为单独的类,然后为每个单独的视图组件使用不同的视图模型。我还使用了协调器(基本上是MVVMC),我使用协调器来设置视图控制器,然后创建视图模型并将其注入到单独的视图组件中,这些组件可以通过主视图中的IBOutlets访问 我的问题是,我正在使用CoreData,并试图保存一个具有多个关系的NSManagedObject,但是关系模型仅在连接到单独视图组件的其他视图模型中可用。当从我的主视图点击保存按钮时,是否有一种干净的

因此,我使用MVVM体系结构,构建了一个相当复杂的视图,因此我决定将视图拆分为单独的类,然后为每个单独的视图组件使用不同的视图模型。我还使用了协调器(基本上是MVVMC),我使用协调器来设置视图控制器,然后创建视图模型并将其注入到单独的视图组件中,这些组件可以通过主视图中的IBOutlets访问


我的问题是,我正在使用CoreData,并试图保存一个具有多个关系的NSManagedObject,但是关系模型仅在连接到单独视图组件的其他视图模型中可用。当从我的主视图点击保存按钮时,是否有一种干净的方法可以将其他视图模型中的关系模型提供给我的主视图模型(由我的ViewController拥有)。或者我应该考虑使用委托模式,告诉我的其他视图模型save按钮被点击了

所以我认为有几种可能性。下面是我如何处理几乎类似的情况,我希望这能帮助你思考

首先,我为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
    }
}
这意味着当您在Coordinator中创建MainViewModel时,也需要创建childViewModels并将其注入MainViewModel。这也意味着您不需要在视图中对childViewModels进行强引用