2016-11-16 18 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. 

} 

これはサファリにGoogle認証を開きますが、問題は、デリゲートメソッドをGoogleLoginWrapperクラスで呼び出されることはありませんです。しかし、GoogleLoginWrapperで定義された同じコードをAppdelegateに入れても、それは機能します。なぜそれが起こっているのですか?

答えて

1

GoogleLoginWrapperのインスタンスは、viewDidLoadメソッドの最後に範囲外になるため、すぐに割り当てが解除されます。投稿したコードでsign...関数を呼び出すことはできません。

ローカル変数の代わりにプロパティを使用して、GoogleLoginWrapperインスタンスへの参照を保持する必要があります。

+0

私は同じことを考えたので、上記のようなことをしました。更新されたコードを確認してください。それは動作しません。 –

+1

その変更は何も修正しません。 'ViewController'クラスに' GoogleLoginWrapper'への参照を保持する必要があります。あなたの変更は後方にあり、弱い参照は問題を解決しません。 – rmaddy

+1

暗黙のうちにアンラップされた弱参照は、単に問題を求めています。 – Paulw11

関連する問題