AppDelegate 未提供 UIViewController

Posted

技术标签:

【中文标题】AppDelegate 未提供 UIViewController【英文标题】:UIViewController not presented from AppDelegate 【发布时间】:2020-04-24 21:17:54 【问题描述】:

如果用户尚未实例化,我正在尝试显示注册/登录 ViewController,但由于某种原因,ViewController 不想显示自己,它显示的是一个黑色页面,上面什么都没有。这是我在AppDelegate.swift 文件中的内容,如果用户尚未注册(我还没有),它应该显示 ViewController,我在 VC 的ViewDidLoad() 中设置了一个断点,它没有命中。有人知道出了什么问题吗?

var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
        // Override point for customization after application launch.
        FirebaseApp.configure()

        if Auth.auth().currentUser == nil 
            let storyboard = UIStoryboard(name: "Main", bundle: Bundle.main)
            let authVC = storyboard.instantiateViewController(identifier: "AuthVC")
            window?.makeKeyAndVisible()
            window?.rootViewController?.present(authVC, animated: true, completion: nil)

        
        return true
    

【问题讨论】:

你的rootViewController可能是nil,在if语句中设置断点。 你有场景代理类吗? 是的,在这种情况下,分配根视图控制器是您的责任。这可能是一个包含 authVC 的导航控制器,也可能是 authVC 本身,具体取决于您在登录后所做的事情。 rootViewController 确实是 nil 我删除了 SceneDelegate 因为我读到它可能会干扰 window.makeKeyAndVisible() 函数 【参考方案1】:

如果您删除了场景委托,您需要在呈现任何内容之前创建窗口

window  = UIWindow(frame: UIScreen.main.bounds)
if let window = window 
window.rootViewController = UIViewController()
window.makeKeyAndVisible()
window.rootViewController?.present(authVC, animated: true, completion: nil)

对于场景委托

 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 windowScene = (scene as? UIWindowScene) else  return 

     window = UIWindow(windowScene: windowScene)
     let navigationController = UINavigationController(rootViewController: UIViewController()) // instead of UIViewController() give it your application root controller... which you want to show when you dismiss presented controller 
     window?.rootViewController = navigationController  
     window?.makeKeyAndVisible()
     window?.rootViewController?.present(authVC, animated: true, completion: nil)
    

【讨论】:

viewDidLoad 触发了,但是实际的 ViewController 没有显示,知道为什么吗? 我把 SceneDelegate 添加回来了 谁调用了? AuthVC,我想展示的VC,但它实际上并没有展示VC,它只是去了我最初的VC] 所以你现在使用的是场景代理还是应用代理?

以上是关于AppDelegate 未提供 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

强制终止后未调用 AppDelegate 方法

未调用 AppDelegate 方法

向 AppDelegate 添加协议未注册

未修改的 AppDelegate.m 中的编译错误

未调用 appdelegate 中的 clickedButtonAtIndex

MacOS 通用链接未在 AppDelegate 中运行预期功能