我正在尝试创建一个类,它将处理我的项目中的所有登录服务。除了谷歌的登录外,一切都很正常。
我希望实现Google登录,而不是在UIViewController中,正如Google文档中提到的,您可以通过使用GIDSignInDelegate来实现这一点,并在类不是UIVIewController时使用它。
我的类是从NSObject扩展而来的,希望在该服务上处理Google SignIn,然后只需要调用一种方法就可以了。
var ls: LoginService = LoginService.instance
ls.doGoogleLogin()这是我的LoginService:
struct LOGIN_URL {
static let LOGIN: String = "login"
}
protocol LoginServiceDelegate: class {
func loginSuccess(loginResponse: User)
func loginFailed(message: String)
}
class LoginService: NSObject, GIDSignInDelegate{
static let instance = LoginService()
weak var delegate: LoginServiceDelegate?
var user: User?
func doGoogleLogin(){
var configureError: NSError?
GGLContext.sharedInstance().configureWithError(&configureError)
assert(configureError == nil, "Error configuring Google services: \(configureError)")
GIDSignIn.sharedInstance().delegate = self
// GIDSignIn.sharedInstance().uiDelegate = self
GIDSignIn.sharedInstance().signIn()
}
public func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
print(user.profile.email)
}
func signIn(signIn: GIDSignIn!,
presentViewController viewController: UIViewController!) {
self.presentViewController(viewController, animated: true, completion: nil)
}
func signIn(signIn: GIDSignIn!,
dismissViewController viewController: UIViewController!) {
self.dismissViewControllerAnimated(true, completion: nil)
}
}当我使用这段代码时,我得到了一个错误value of type LoginService has no member presentViewController
在这里应该做什么才不会得到这个错误呢?
发布于 2016-12-07 16:03:38
通过键入self.presentViewController,您的意思是self所引用的类是可以使用presentViewController方法的对象类型。在本例中,当您说self时,您引用的是一个LoginService实例。LoginService继承了NSObject,这意味着它不是可以调用该方法的对象,比如View Controller或Navigation Controller。
我认为您需要在LoginService类的顶部添加委托方法。
protocol LoginServiceDelegate: class {
func loginSuccess(loginResponse: User)
func loginFailed(message: String)
func googleSignInLaunch(_ viewController: UIViewController)
func googleSignInDismiss(_ viewController: UIViewController)
}然后当你打电话:
func signIn(signIn: GIDSignIn!, presentViewController viewController: UIViewController!) {
//call delegate method here
//which will trigger view controller calling this to launch something
delegate?.googleSignInLaunch(_ viewController: UIViewController)
}
func signIn(signIn: GIDSignIn!,
dismissViewController viewController: UIViewController!) {
delegate?.googleSignInDismiss(_ viewController: UIViewController)
}然后在中调用您的登录服务:
class MyViewController: UIViewController {
let loginService = LoginService()
override func viewDidLoad() {
loginService.delegate = self
loginService.doGoogleLogin()
}
func googleSignInLaunch(_ viewController: UIViewController) {
self.presentViewController(viewController, animated: true, completion: nil)
}
func googleSignInDismiss(_ viewController: UIViewController) {
self.dismissViewControllerAnimated(true, completion: nil)
}
//the methods below are the other two methods that were in your LoginService protocol
func loginSuccess(loginResponse: User) {
//whatever you need to do
}
func loginFailed(message: String) {
//whatever you need to do
}
}发布于 2016-12-07 15:56:18
您的LoginService类不是UIViewController,因此运行presentViewController将无法工作。尝试使用下面的代码获取最高级的ViewController,并在该ViewController上调用presentViewController。
if var topController = UIApplication.shared().keyWindow?.rootViewController {
while let presentedViewController = topController.presentedViewController {
topController = presentedViewController
}
// Call presentViewController on topController
}https://stackoverflow.com/questions/41021304
复制相似问题