作者:尘世聚散 | 来源:互联网 | 2023-02-10 13:47
我正在我的应用上实施Google登录,我需要访问用户ID和名/姓.存储该数据的变量位于App Delegate中.我已经在内部和外部搜索了如何在Swift 3中执行此操作,并且绝对没有任何内容.
这是App代表(至少是重要的部分):
class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {
var window: UIWindow?
var databaseRef: FIRDatabaseReference!
var userID = String()
var givenName = String()
var familyName = String()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
// Use Firebase library to configure APIs
FIRApp.configure()
GIDSignIn.sharedInstance().clientID = FIRApp.defaultApp()?.options.clientID
GIDSignIn.sharedInstance().delegate = self
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any] = [:]) -> Bool {
return GIDSignIn.sharedInstance().handle(url,
sourceApplication: options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
annotation: options[UIApplicationOpenURLOptionsKey.annotation])
}
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
if let error = error {
print(error.localizedDescription)
return
}
print("User signed into Google")
let authentication = user.authentication
let credential = FIRGoogleAuthProvider.credential(withIDToken: (authentication?.idToken)!,
accessToken: (authentication?.accessToken)!)
FIRAuth.auth()?.signIn(with: credential) { (user, error) in
print("User Signed Into Firebase")
self.databaseRef = FIRDatabase.database().reference()
self.databaseRef.child("user_profiles").child(user!.uid).observeSingleEvent(of: .value, with: { (snapshot) in
let snapshot = snapshot.value as? NSDictionary
if(snapshot == nil)
{
self.databaseRef.child("user_profiles").child(user!.uid).child("name").setValue(user?.displayName)
self.databaseRef.child("user_profiles").child(user!.uid).child("email").setValue(user?.email)
}
})
}
userID = user.userID
givenName = user.profile.givenName
familyName = user.profile.familyName
continueToWallet()
}
在View Controller中,我正在调用App委托并尝试接收数据,但它给出了一个错误说"实例成员'用户ID'不能用于'AppDelegate'类型"
class addToWalletController: UIViewController {
var ID = String()
let delegate = UIApplication.shared.delegate as! AppDelegate
let user = AppDelegate.userID
let firstName = AppDelegate.givenName
let lastName = AppDelegate.familyName
override func viewDidLoad() {
super.viewDidLoad()
}
}
我也尝试在= AppDelegate.userID中使用委托切换AppDelegate,但它给了我同样的错误.这是怎么回事?
1> 小智..:
错误消息已告诉您property initializers run before 'self' is available
.
也许你应该初始化它 viewDidLoad
let delegate = UIApplication.shared.delegate as! AppDelegate
var user: String?
var firstName: String?
var lastName: String?
override func viewDidLoad() {
super.viewDidLoad()
user = delegate.userID
firstName = delegate.givenName
lastName = delegate.familyName
}
2> Samantha..:
AppDelegate
是班级.你想要的AppDelegate
是你的应用程序委托的实例.此外,您不能使用delegate
您声明的常量来设置其他实例成员的值,因为它也是实例成员本身.
我想像这样实现一个函数AppDelegate
:
static func shared() -> AppDelegate {
return UIApplication.shared.delegate as! AppDelegate
}
然后我可以从其他地方调用它:
let firstName = AppDelegate.shared().givenName
另一种选择是使用delegate
您定义的属性设置这些属性的值,但是稍后再执行viewDidLoad
,例如Alvin的回答建议.