2017-10-15 82 views
0

我已成功将Google Sign-In集成到我的AppDelegate.swift文件的iOS应用程序中,并且可以成功检测到成功登录(通过在控制台上打印“success” )。问题是,在成功登录后,当我想要进入应用程序的下一个屏幕时,我回到Google Sign-In页面。Swift:在AppDelegate.swift中执行Segue

AppDelegate.swift文件无法识别performSegue函数,因为它是UIViewController类的函数(请纠正我,如果我错了)。为了解决这个问题,我创建的视图控制器文件中的全局变量,这样,每当此值被改变SEGUE将执行:

AppDelegate.swift:

var userSignedInGlobal = "n/a" 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate { 

    // A bunch of code that implements the Google Sign in ... 

    print("Successfully logged into Google.", user) 
    userSignedInGlobal = "success" 

} 

然后我InitialViewController.swift文件:

class InitialViewController: UIViewController, GIDSignInUIDelegate { 

    var userSignedIn = userSignedInGlobal { 
     didSet { 
      performSegue(withIdentifier: "segueOne", sender: self) 
     } 
    } 

    // A bunch of irrelevant code. 

} 

这没有工作,我觉得这不工作的原因是userSignedInGlobal在InitialViewController.swift文件被通过引用传递 - 因此即使它的价值变化,userSignedIn的价值呢不是cha恩格(再次,如果我错了,请纠正我)。

要解决这个问题,我改变了我的InitialViewController.swift文件,如下所示:

var userSignedIn = userSignedInGlobal { 
    didSet { 
     doSegue() 
    } 
} 

class InitialViewController: UIViewController, GIDSignInUIDelegate { 

    func doSegue() { 
     performSegue(withIdentifier: "segueOne", sender: self) 
    } 

    // A bunch of irrelevant code. 

} 

这给了我一个错误,在第三行:“未解决的标识符的使用‘doSegue()’”

当登录成功时,我不知道如何执行segue。任何帮助将不胜感激,在此先感谢。

回答

3

这里有几个问题:

在应用程序委托
  1. 全局变量

有许多答案演示如何全局变量存储在您的AppDelegate和随后引用该变量在视图控制器,例如getting a reference to app delegate

  • 只能从故事板执行Segue公司基于控制器
  • 您将无法使用performSegue除非当前视图控制器从故事板加载(见performSegue) 。从你的AppDelegate加载的任何Google视图可能都不是这种情况。

    1. 您是否在正确的位置进行登录?

    您可能想重新考虑AppDelegate和您的初始视图控制器之间的职责分工。也许你正试图在AppDelegate中做太多。也许你应该将一些代码(显示Google表单)移动到你的初始VC,然后根据结果重新设置或重置你的导航控制器。

    希望这会有所帮助。

    +0

    PS:请注意,您的initialVC可以是GIDSignInDelegate和GIDSignInUIDelegate。这简化了一些事情,你可以找到很多使用这种方法的例子。然而,如果你想让你的AppDelegate充当GIDSignInDelegate并且你的VC充当GIDSignInUIDelegate(如你的代码片段所示),那么你可能需要看看使用NotificationCenter从AppDelegate的signIn func传递消息,到你的VC。观察者(可能在您的VC中)可以执行一次执行任务或其他任何事情。 – ozzieozumo

    +0

    感谢您的回复!我尝试将Google Sign In代码移到我的VC中,但由于某种原因,该函数从未被调用......我为什么会感到困惑。你有什么想法? –