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的主要内容,如果未能解决你的问题,请参考以下文章