0

我尝试通过在应用程序启动时将其注入到RootViewController中,在AppDelegate.swift的didFinishLaunchingWithOptions中创建一次RootViewModel实例,因此它不会被多次创建。

这是代码片段:

...

var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        guard let rootViewController = window?.rootViewController as? RootViewController else {
            fatalError("Unable to Instantiate the root view controller")
        }

        let rootViewModel = RootViewModel()
        
        rootViewController.viewModel = rootViewModel
        
        return true
    }

...

RootViewModel是一个基本的swift 类,还没有实现,而RootViewController有一个可选的viewModel属性来允许注入。

var viewModel: RootViewModel?

这是我的问题:每次运行应用程序时,它都会停在我创建的fatalError处,以了解创建rootViewController是否一切顺利。所以,这意味着一切都不顺利。

我认为在创建rootViewController时 window 属性仍然为空,但我不知道如何解决这个问题。

我尝试在SceneDelegate中创建相同的东西,但没有成功。

我可以做些什么来解决这个问题?我正在使用 XCode 12.5 版

4

1 回答 1

1

由于您采用了新的场景生命周期并拥有场景委托,因此您需要在willConnectTo场景委托功能中访问根视图控制器。

这是因为您的应用程序可能不再只有一个窗口,而是可能有多个窗口,例如,如果您在 iPadOS 上支持多个视图。


func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
     guard let scene = (scene as? UIWindowScene) else { return }
        
     if let rootVC = scene.windows.first?.rootViewController as? RootViewController {
         rootViewController.viewModel = RootViewModel()
    }
}
于 2021-05-05T10:22:28.943 回答