这是我为 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/