如何使用 navigationController 将视图模型传递给 viewcontroller?

How to pass viewmodel to a viewcontroller using navigationController?

所以我运行进入这个奇怪的problem.This是我的导航 navigation 基本上是 LoginVC,然后是 NavigationController,然后是 HomeVC 我正在尝试将 rootViewcontroller 从 loginVC 更改为 Navigation.HomeVC 本身就是 navigationController 的 rootVC。 问题是我不知道如何将 viewmodel 从 loginVC 传递到 homeVC。 这就是我实例化 NavigationController 的方式:

loginViewModel.loginStatus.bind { [weak self] isLoggedIn in
        switch isLoggedIn {
        case true:
            print("---login was successfull,transfering to home page---")
            let navController = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "customNavigationController") as! UINavigationController
            self!.view.window?.rootViewController = navController
         
        case false:
            AlertManager.initializeAlert(show: .incorrectData, on: self!)
        default: break
        }
    }
}

但我不知道如何将 ViewModel 传递到我的 homeVC

init(_ viewmodel: HomeViewModel) {
    self.homeViewModel = viewmodel
    super.init(nibName: nil, bundle: nil)
}

有什么办法可以实现吗?还是我在做一些基金

如果您通过 Storyboard 初始化 HomeVC,则无法使用 init(viewmodel:) 初始化程序对其进行初始化。 Storyboard 使用 init(coder:) 初始化器来初始化你的视图控制器。因此,您需要在初始化 HomeVC 后设置视图模型。如果你在 Storybard 上将 HomeVC 设置为 UINavigationController 的根目录。您可以从 UINavigationControllertopViewController 属性.

找到它

但是如果你想使用初始化注入方法来传递你的依赖项,那么你需要以编程方式初始化你的视图控制器。例如:

loginViewModel.loginStatus.bind { [weak self] isLoggedIn in
        switch isLoggedIn {
        case true:
            print("---login was successfull,transfering to home page---")
            let homeView = HomeVC(HomeViewModel()) // you can replace it with your actual view model
            let navController = UINavigationController(rootViewController: homeView)
            self!.view.window?.rootViewController = navController
         
        case false:
            AlertManager.initializeAlert(show: .incorrectData, on: self!)
        default: break
        }
    }
}

但是,为了以编程方式初始化视图控制器,您也需要以编程方式进行 VC 的设计,或者您需要使用 xib 文件而不是 Storyboard。