【问题标题】:Delegate method is not called in a custom class未在自定义类中调用委托方法
【发布时间】:2017-03-31 04:09:20
【问题描述】:

这是我为谷歌登录制作的包装类。

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 上打开 google 身份验证,但问题是从未在 GoogleLoginWrapper 类中调用委托方法。但是,如果我将 GoogleLoginWrapper 中定义的相同代码放在 Appdelegate 中,它就可以工作。为什么会这样?

【问题讨论】:

    标签: ios swift delegates google-signin


    【解决方案1】:

    您的GoogleLoginWrapper 实例在您的viewDidLoad 方法结束时超出范围,因此它会立即被释放。您不能使用您发布的代码调用sign... 函数。

    您应该使用属性而不是局部变量来保持对GoogleLoginWrapper 实例的引用。

    【讨论】:

    • 我也有同样的想法,所以我做了类似上面的事情。请检查更新的代码。它不起作用。
    • 该更改无法解决任何问题。您需要在 ViewController 类中保留对 GoogleLoginWrapper 的引用。您的更改是向后的,弱引用并不能解决问题。
    • 而隐式展开的弱引用只是自找麻烦。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多