从 SceneDelegate 实例化时如何获取完整的 viewController

Posted

技术标签:

【中文标题】从 SceneDelegate 实例化时如何获取完整的 viewController【英文标题】:how to get full viewController back when instantiating from SceneDelegate 【发布时间】:2021-02-27 19:43:45 【问题描述】:

所以在我的最后一个问题中,我试图从 AppDelegate 实例化,但它不起作用,所以在做了更多研究后,我一直看到 SceneDelegate 并决定试一试。令我惊讶的是,它起作用了,但并不是我想要的那样。

所以这是登录时 viewController 的正常图像。

不要介意空格,我在自动布局方面遇到了问题,这是我将来会解决的问题。我希望在从SceneDelegate.swift 实例化 VC 时显示这个精确的图像,其中包含按钮、导航栏、用户交互和正确显示的所有内容。

现在,当我在 SceneDelegate willConnectTo() 方法中运行这段代码时...

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).
    self.window = self.window ?? UIWindow()

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
     let auth = Auth.auth()

    
    auth.addStateDidChangeListener  (_, user) in

        if let user = user 
            let alreadyLoggedInViewController = storyboard.instantiateViewController(withIdentifier: Constants.StoryboardIDs.StudentEventDashboardStoryboardID) as! StudentSegmentedTableViewController
            self.window!.rootViewController = alreadyLoggedInViewController
            self.window!.makeKeyAndVisible()
        



    
    
    guard let _ = (scene as? UIWindowScene) else  return 

我最终得到了这个......

我真的很高兴看到它,因为我的代码终于可以工作了,但是它没有显示带有栏按钮项目的导航栏,这有点粉碎了幸福。分段控件仍然是交互式的,并且 tableview 仍然刷新,这很棒,但我只想恢复我的正常 VC,以便用户可以正常使用该应用程序并查看所有其他 UI。如果有人可以帮助解决这个问题,那对我来说将是一个很大的帮助。提前致谢。

【问题讨论】:

【参考方案1】:

太棒了,我需要做的就是添加这行代码..

 let navigationizedVC = UINavigationController(rootViewController: alreadyLoggedInViewController)

那就这样做吧……

             self.window!.rootViewController = navigationizedVC

完美运行。

【讨论】:

以上是关于从 SceneDelegate 实例化时如何获取完整的 viewController的主要内容,如果未能解决你的问题,请参考以下文章

类加载器实例化时的顺序

类加载器实例化时的顺序

如何将值从 SceneDelegate 文件传输到 ViewController (Swift 5)

如何从 XCUIApplication 对象访问当前的 SceneDelegate?

SwiftUI如何从视图调用或通知scenedelegate

如何强制 Java 在实例化时重新加载类?