首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >谷歌在UIVIewController中注册

谷歌在UIVIewController中注册
EN

Stack Overflow用户
提问于 2016-12-07 15:27:38
回答 2查看 1.8K关注 0票数 2

我正在尝试创建一个类,它将处理我的项目中的所有登录服务。除了谷歌的登录外,一切都很正常。

我希望实现Google登录,而不是在UIViewController中,正如Google文档中提到的,您可以通过使用GIDSignInDelegate来实现这一点,并在类不是UIVIewController时使用它。

我的类是从NSObject扩展而来的,希望在该服务上处理Google SignIn,然后只需要调用一种方法就可以了。

代码语言:javascript
运行
复制
var ls: LoginService = LoginService.instance
 ls.doGoogleLogin()

这是我的LoginService:

代码语言:javascript
运行
复制
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

在这里应该做什么才不会得到这个错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-07 16:03:38

通过键入self.presentViewController,您的意思是self所引用的类是可以使用presentViewController方法的对象类型。在本例中,当您说self时,您引用的是一个LoginService实例。LoginService继承了NSObject,这意味着它不是可以调用该方法的对象,比如View ControllerNavigation Controller

我认为您需要在LoginService类的顶部添加委托方法。

代码语言:javascript
运行
复制
protocol LoginServiceDelegate: class {
  func loginSuccess(loginResponse: User)
  func loginFailed(message: String)
  func googleSignInLaunch(_ viewController: UIViewController)
  func googleSignInDismiss(_ viewController: UIViewController)
}

然后当你打电话:

代码语言:javascript
运行
复制
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)
}

然后在中调用您的登录服务:

代码语言:javascript
运行
复制
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
  }

}
票数 1
EN

Stack Overflow用户

发布于 2016-12-07 15:56:18

您的LoginService类不是UIViewController,因此运行presentViewController将无法工作。尝试使用下面的代码获取最高级的ViewController,并在该ViewController上调用presentViewController

代码语言:javascript
运行
复制
if var topController = UIApplication.shared().keyWindow?.rootViewController {
    while let presentedViewController = topController.presentedViewController {
        topController = presentedViewController
    }

    // Call presentViewController on topController
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41021304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档