谷歌登录后使用 Swift 4 推送视图控制器
Posted
技术标签:
【中文标题】谷歌登录后使用 Swift 4 推送视图控制器【英文标题】:Pushing a view controller using Swift 4 after Google Sign In 【发布时间】:2018-05-27 05:43:47 【问题描述】:我正在使用 Firebase 和 Swift 4 开发我的应用,但在 Google 登录完成后我无法推送新的视图控制器。据我所知,我应该将 pushViewController 代码放在 didSignIn 方法中,但该部分在我的 AppDelegate.swift 文件中(因为它实现了 GIDSignInDelegate,根据 Firebase 文档)。
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?)
// ...
if let error = error
// ...
return
guard let authentication = user.authentication else return
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
// ...
现在,我想在登录完成后推送一个新的视图控制器,使用类似:
navigationController?.pushViewController(BrowserViewController(), animated: true)
但似乎不可能从 AppDelegate 文件中推送 VC,因为那里不存在 navigationController。我在不使用 Storyboard 的情况下以编程方式创建视图,因此我也无法执行 segue。
在用户使用 Google 登录完成登录后,我如何能够展示新的 VC?我应该将 didSignInFor 方法移动到实际托管登录按钮的视图控制器(即使文档似乎没有说这是正确的方法)?
【问题讨论】:
【参考方案1】:解决此问题的一种方法是在登录成功时使用通知中心从您的应用代理发布通知,然后在托管登录按钮的视图控制器中观察此通知。
这是 swift 4 中的示例:
在您的应用委托中的 didSignInFor 方法中:
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?)
// ...
if let error = error
// ...
return
guard let authentication = user.authentication else return
let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
accessToken: authentication.accessToken)
// ...
NotificationCenter.default.post(
name: Notification.Name("SuccessfulSignInNotification"), object: nil, userInfo: nil)
在承载登录按钮的 ViewController 中:
override func viewDidLoad()
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(didSignIn), name: NSNotification.Name("SuccessfulSignInNotification"), object: nil)
@objc func didSignIn()
// Add your code here to push the new view controller
navigationController?.pushViewController(BrowserViewController(), animated: true)
deinit
NotificationCenter.default.removeObserver(self)
如果您还想处理失败的登录尝试,您可以使用相同的技巧并发布失败通知,然后在视图控制器中观察它。或者,您也可以对两种情况(成功和失败)使用一个通知,并在每种情况下传递不同的值。
【讨论】:
嘿,谢谢!我以前没有想到这一点——这绝对是一个创造性的解决方案! 非常有创意的解决方案!非常感谢您!【参考方案2】:如果我没有正确回答您的问题,请尝试在应用程序委托中创建一个导航控制器并将其分配给窗口,然后您可以使用 push to view controller 推送到个人 viewcontroller
。
navigationController?.pushViewController(BrowserViewController(), animated: true)
供参考:
class AppDelegate: UIResponder, UIApplicationDelegate
// Main Nevigation view controller maintained stack
var navigationController: UINavigationController!
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool
// Override point for customization after application launch.
// Home Screen view Object
let homeVC = HomeVC.init(nibName: "HomeVC", bundle: nil)
// Allocate navigation controller
self.navigationController =
UINavigationController(rootViewController: homeVC)
return true
// Custom navigation View Assign window root view controller.
self.window?.rootViewController = self.navigationController
self.window?.makeKeyAndVisible()
【讨论】:
以上是关于谷歌登录后使用 Swift 4 推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章