Swift:在AppDelegate.Swift中执行Segue



我已经成功地将谷歌登录集成到我的AppDelegate.swift文件中的iOS应用程序中,并且可以成功地检测到成功登录(通过在控制台上打印"成功")。问题是,在成功登录后,当我想进入应用程序的下一个屏幕时,我会回到谷歌登录页面。

AppDelegate.swift文件无法识别performSegue函数,因为它是UIViewController类的函数(如果我错了,请纠正我)。为了解决这个问题,我在ViewController文件中创建了一个全局变量,这样每当这个值发生变化时,就会执行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.
}

这样做不起作用,我认为这不起作用的原因是InitialViewController.swift文件中的userSignedInGlobal是通过引用传递的,所以即使它的值发生了变化,userSignedIn的值也不会发生变化(同样,如果我错了,请纠正我)。

为了解决这个问题,我更改了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。如有任何帮助,我们将不胜感激,并提前表示感谢。

这里有几个问题:

  1. 应用程序代理中的全局变量

有许多答案演示了如何在AppDelegate中存储全局变量,然后在视图控制器中引用该变量,例如获得应用程序代理的引用

  1. 仅从基于情节提要的控制器执行Segue

除非您当前的视图控制器是从情节提要加载的,否则您将无法使用performSegue(请参阅performSegue)。无论你从AppDelegate加载什么谷歌视图,情况可能都不是这样。

  1. 您的登录位置正确吗

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

希望这能有所帮助。

最新更新