2017-10-15 84 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中,但由於某種原因,該函數從未被調用......我爲什麼會感到困惑。你有什麼想法? –