在准备segue方法中初始化ViewController是一个好习惯吗?

时间:2018-05-05 11:47:59

标签: ios swift unit-testing mvvm architecture

我有3个类:MyProfileVC,NewProfileVC和NewProfileViewModel。 为了使我的测试编写更容易,我决定在我的最后两个类中创建初始化器,如下所示:

NewProfileViewController:

var user: Users
var viewModel: NewProfileViewModel

init(for user: Users, with coreDataStack: CoreDataStack) {
    self.user = user
    self.viewModel = NewProfileViewModel(for: user, with: coreDataStack)

    super.init(nibName: nil, bundle: nil)
}

其中NewProfileViewModel有自己的init:

var user: Users
var coreDataStack: CoreDataStack

init(for user: Users, with coreDataStack: CoreDataStack) {
    self.user = user
    self.coreDataStack = coreDataStack
}

最后,我尝试将它们初始化为MyProfileViewController中的链:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "toNewProfile" {
        var viewController = segue.destination as! NewProfileViewController
        viewController = NewProfileViewController(for: sender as? Users ?? Users(context: coreDataStack.mainContext), with: coreDataStack)            
    }
}

因此,这会初始化我的NewProfileVC,而NewProfileVC会初始化NewProfileViewModel

但是我想问一下开发人员的经验比我更高,以这种方式初始化prepare: for segue内部的VC是一种很好的做法,或者你能给我更好的想法吗? 我不想写代码只是简单的工作,但想要建立一个好的架构,我没有任何导师问他,所以唯一的地方是Stack,我希望你能帮助我。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

您应该 初始化prepareForSegue中的新视图控制器。

purpose of this method 配置新视图控制器在显示之前。 (重点补充)。

segue为您提供初始化的目标视图控制器。使用此实例非常重要,以便您在故事板中定义的所有插座和操作都已正确设置。对于以您显示的方式初始化的视图控制器,情况并非如此。

要将数据传递给视图控制器,请在NewProfileViewController中将数据变量定义为选项:

var user: Users?
var viewModel: NewProfileViewModel?

并将其设置为prepareForSegue

if segue.identifier == "toNewProfile" {
    var viewController = segue.destination as! NewProfileViewController
    var user = Users ?? Users(context: coreDataStack.mainContext)
    viewController.user = user
    viewController.viewModel = NewProfileViewModel(for: user, with: coreDataStack)            
}

对此的一个可能的改进是在视图控制器中添加和调用一个方法,该方法获取所需的所有数据:

if segue.identifier == "toNewProfile" {
    var viewController = segue.destination as! NewProfileViewController
    var user = Users ?? Users(context: coreDataStack.mainContext)
    viewController.configureOnSegue(user: user, viewModel: NewProfileViewModel(for: user, with: coreDataStack))            
}

添加的视图控制器方法如下所示:

func configureOnSegue(user: Users, viewModel: NewProfileViewModel) {
    self.user = user
    self.viewModel = viewModel
}