自定义类中未调用委托方法

问题描述:

这是我为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中定义的代码放在同一个代码中,它就可以工作。为什么会发生?

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

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

+0

我以为同样的事情,所以我做了上面的事情。请检查更新的代码。它不起作用。 –

+1

该更改不能解决任何问题。您需要在“ViewController”类中保留对“GoogleLoginWrapper”的引用。你的变化是倒退的,弱的参考不能解决问题。 – rmaddy

+1

而一个隐含的解开的弱引用只是要求麻烦。 – Paulw11