ios - 自定义类中未调用委托(delegate)方法

标签 ios swift delegates google-signin

这是我为 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!) {
   }
}

我从 View Controller 类调用此类,如下所示:

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 类中永远不会调用委托(delegate)方法。但是如果我将 GoogleLoginWrapper 中定义的相同代码放入 Appdelegate 中,它就可以工作。为什么会发生这种情况?

最佳答案

您的 GoogleLoginWrapper 实例在 viewDidLoad 方法末尾超出范围,因此会立即释放。您无法使用您发布的代码调用 sign... 函数。

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

关于ios - 自定义类中未调用委托(delegate)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40640971/

相关文章:

C# 最佳实践 : Using a delegate or an interface as a class dependency

c# - Func<T> 获取每次调用的结果?

ios - 使用 AFNetworking 2.0 创建自己的委托(delegate)和协议(protocol)

ios - 导航被拒绝 - <allow-navigation> 没有为 url ='gap://ready' 设置

ios - UITextView - 使用在 UITableViewCell() 中选择的所有文本开始编辑

Swift 2 通用数据结构不符合 Equatable 协议(protocol)

swift - 循环遍历 Firebase 数据会生成空表?

ios - Swift 2 - AFNetwork 请求缓存问题

ios - opengles 中的 glReadPixels() 内存泄漏?

python - kivy-ios .toolchain.py:第4行:语法错误:Mac High Sierra中的文件意外结束