2016-11-16 75 views
1

這是我爲Google登錄創建的包裝類。自定義類中未調用委託方法

class GoogleLoginWrapper:NSObject, GIDSignInDelegate { 

weak var presentingController:UIViewController! 

init(presentingController:UIViewController) { 
    super.init() 
    self.presentingController = presentingController 
    var configureError:NSError? 
    GGLContext.sharedInstance().configureWithError(&configureError) 
    GIDSignIn.sharedInstance().delegate = self 
} 

// Google Delegate Methods 
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) { 

    } 

    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) { 
    } 
} 

而且我如下調用從視圖控制器類這個類:

class ViewController: UIViewController,GIDSignInUIDelegate{ 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     let googleWrapper = GoogleLoginWrapper(presentingController: self) 
    } 

    //IBAction method to call google login. 

} 

這將打開谷歌認證的Safari瀏覽器,但問題是委託方法永遠不會在GoogleLoginWrapper類調用。但是,如果我在Appdelegate中將GoogleLoginWrapper中定義的代碼放在同一個代碼中,它就可以工作。爲什麼會發生?

回答

1

您的GoogleLoginWrapper實例在viewDidLoad方法結束時超出了範圍,因此它會立即釋放。您無法使用您發佈的代碼調用sign...函數。

您應該使用屬性而不是局部變量來保留對GoogleLoginWrapper實例的引用。

+0

我以爲同樣的事情,所以我做了上面的事情。請檢查更新的代碼。它不起作用。 –

+1

該更改不能解決任何問題。您需要在「ViewController」類中保留對「GoogleLoginWrapper」的引用。你的變化是倒退的,弱的參考不能解決問題。 – rmaddy

+1

而一個隱含的解開的弱引用只是要求麻煩。 – Paulw11