代码之家  ›  专栏  ›  技术社区  ›  J. Doe

在prepare for segue方法中初始化ViewController是否是一种良好的做法?

  •  0
  • J. Doe  · 技术社区  · 8 年前

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

    新建ProfileViewController:

    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 有自己的初始化:

    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 以及 新建配置文件VC 将初始化 新建ProfileViewModel

    但是我想问那些有着比我更高经验的开发人员,在 prepare: for segue 那样我刚才做了什么,或者你能给我更好的主意? 我不想编写简单有效的代码,但我想构建一个好的架构,我没有任何导师可以问他,所以唯一的地方就是Stack,我希望你能帮助我。 提前感谢!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Mike Taverne    8 年前

    你应该 在中初始化新的视图控制器 prepareForSegue

    这个 purpose of this method 配置 显示之前的新视图控制器 (增加强调)。

    segue为您提供 已初始化 目标视图控制器。使用此实例非常重要,这样才能正确设置在情节提要中定义的所有出口和操作。对于以您显示的方式初始化的视图控制器,情况并非如此。

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

    var user: Users?
    var viewModel: NewProfileViewModel?
    

    把它们放进去 准备工作表 :

    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
    }