ios - 从 App Delegate 推送标签栏控制器
问题描述
我有以下代码,我试图推送 Home2ViewController(标签栏控制器),因此用户将在他的 Google 登录过程后被重定向到此:
let viewController: Home2ViewController = storyboard.instantiateViewController(withIdentifier: "HomeVC") as! Home2ViewController;
// error occurs on the following line
let rootViewController = self.window!.rootViewController as! UINavigationController;
rootViewController.pushViewController(viewController, animated: true);
我收到一条错误消息:
在展开可选值时意外发现 nil
在我定义rootViewController
.
Home2ViewController
是情节提要的子类,并在情节提要中UITabBarController
被标识为。HomeVC
如何解决此错误,以便在 Google 登录程序之后显示正确的控制器?
编辑:这是来自 AppDelegate 的 Google 登录方法的完整代码。
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
if let err = error {
print("Failed to log into Google", err)
return
}
guard let idToken = user.authentication.idToken else {return}
guard let accessToken = user.authentication.accessToken else {return}
let credentials = GoogleAuthProvider.credential(withIDToken: idToken,accessToken: accessToken)
print("Successfully logged into Google", user)
Auth.auth().signInAndRetrieveData(with: credentials, completion: { (user, error) in
if let err = error {
print("Failed to create a Firebase user with Google account", err)
return
}
print("Successfully logged into Firebase with Google")
let storyboard = UIStoryboard(name: "Main", bundle: nil);
guard let initialViewController = storyboard.instantiateViewController(withIdentifier: "HomeVC") as? Home2ViewController else { return }
self.window?.rootViewController = initialViewController
self.window?.makeKeyAndVisible()
})
}
解决方案
这可能听起来很傻,只要确保标识符名称完全相同,如果这不能解决问题,请将其更改为 storyBoard 和代码中的其他内容,它发生在我身上一次,解决了问题的方法
推荐阅读
- html - 检查元素是否有子元素
- vuejs2 - 具有相同路由但参数不同的 Vue.$router.push - 如何触发转换?
- macos - 预览 一直冻结 - 没有响应
- r - 如何将大 xlsx 文件作为工作簿导入以读取单元格颜色?
- excel - 如何在 Excel Power Query 上选择具有相同模式的列
- java - 在整个点击功能完成之前,视图不会更新
- microsoft-graph-api - 无法更新威胁情报指示器 beta 端点
- ios - view.center 命令后子视图框架未更新
- java - 如何将临时 ArrayList 中的元素复制到新创建对象中的私有 ArrayList 中?
- python - 当您不指定顺序时 - 为什么结果顺序会有所不同?