来自appDelegate performSegue的Swift 3在谷歌登录后无法正常工作

Posted

技术标签:

【中文标题】来自appDelegate performSegue的Swift 3在谷歌登录后无法正常工作【英文标题】:Swift 3 from appDelegate performSegue is not working after google signin 【发布时间】:2017-06-13 11:48:05 【问题描述】:

我正在尝试实现 Google 登录 及其与登录过程一起使用,但在我的应用程序委托文件中,我有 didSignInFor 函数,并且在成功登录后内部关闭我从 loginVC 发送用户到feedVc

然后它会转到该行并打印下一行中的内容但不执行 Segue。 代码如下:

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) 
    print("Successfully logged into google", user)

    guard let idToken = user.authentication.idToken else return
    guard let accessToken = user.authentication.accessToken else return

    let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: accessToken)

    Auth.auth().signIn(with: credential)  (user, error) in
        if error != nil
            print("ANKIT : Unable to authenticate with firebase")
         else
            guard let uid = user?.uid else  return 

            KeychainWrapper.standard.set(uid, forKey: KEY_UID)

            self.window?.rootViewController?.performSegue(withIdentifier: "goToFeed", sender: nil)

            print("ANKIT : Successfully authenticated with firebase for google")
        
    

谁能帮我解决这个错误? 无法弄清楚为什么 segue 不起作用..或者如果有人遇到这个问题并且他们想通了,请分享解决方案。任何帮助将不胜感激。

【问题讨论】:

使用main thread 进行转场 window 和 rootViewController 是否都设置为值? dispatch_async(dispatch_get_main_queue(), print(results) completion(success: true, object: results) ) 否则这样使用 【参考方案1】:

从 AppDelegate 类你不能perform segue。所以这条线永远不会在你的 AppDelegate 类中起作用。

self.window?.rootViewController?.performSegue(withIdentifier: "goToFeed", sender: nil)

你需要简单

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let scheduleController = storyboard.instantiateViewController(withIdentifier: "yourIdentiFier")
self.window!.rootViewController = scheduleController
self.window!.makeKeyAndVisible()

您可以从 Main.storyboard 为您的控制器提供 Identifier 请按照以下步骤操作。

打开主故事板

    点击您要打开的视图 从控制器顶部选择黄色/向左按钮 现在打开位于右侧的实用工具箱 现在点击 Show the Identical Inspector 现在您可以在此处将您的身份作为 StoryBoard Id 提供

Check this answer for more details

【讨论】:

【参考方案2】:

在处理 UI 操作时使用主队列。您在后台线程中通过Auth 获得回调。所以在你的 else 条件下,使用下面的代码来执行 segue

DispatchQueue.main.async 
            self.window?.rootViewController?.performSegue(withIdentifier: "goToFeed", sender: nil)


【讨论】:

以上是关于来自appDelegate performSegue的Swift 3在谷歌登录后无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

来自 appDelegate 的 javascript 调用:phonegap iOS

来自 AppDelegate 的 PresentViewController 句柄ActionWithIdentifier

SWRevealViewController 不显示来自 Appdelegate 的状态栏推送

来自 appDelegate 的 pushViewController - 问题

来自 AppDelegate 的 UISegmentedControl

来自 AppDelegate 的 Objective-c 导入功能不起作用