在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?
Posted
技术标签:
【中文标题】在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?【英文标题】:Is there anyway to change your view after logging in with a google account in SwiftUI?在 SwiftUI 中使用 google 帐户登录后是否有任何改变视图的方法? 【发布时间】:2019-12-11 14:40:34 【问题描述】:在我的应用程序中,我让用户使用他们的 google 帐户登录,以便将应用程序的其余部分个性化到他们的帐户,但是在他们登录后,我希望它自动更改视图并转到主屏幕,但我没有找到了一种让它工作的方法,而无需在登录后点击单独的按钮来更改视图。
这是登录页面的代码。我目前正在使用NavigationLink
更改视图,但我想知道一种在用户登录后自动执行此操作的方法。
struct LoginPage: View
var body: some View
//Login Page
NavigationView
ScrollView
VStack
VLargeCardView(image: "pad22finalsf", category: "Login", heading: "Welcome to PV Pocket!", author: "PAD22")
//Google Sign In Button
google()
.frame(width: 200, height: 50)
//Switch to main view after login
NavigationLink(destination: MainView())
ZStack
Rectangle()
.frame(width: 300, height: 50)
.cornerRadius(20)
.foregroundColor(.orange)
Text("Click here after sign in!")
.foregroundColor(.primary)
.font(Font.system(size: 25))
.navigationBarHidden(true) .navigationBarTitle("")
如果有帮助,这里还有 Google 登录按钮的代码。
//Creates Google Sign In instance
struct google : UIViewRepresentable
@EnvironmentObject var settings: UserSettings
func makeUIView(context: UIViewRepresentableContext<google>) -> GIDSignInButton
//Create Google Sign In Button
let button = GIDSignInButton()
button.colorScheme = .dark
button.style = .wide
//Add Scopes to Login
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/drive")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/clas-s-room.courses")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/clas-s-room.coursework.me")
GIDSignIn.sharedInstance().scopes.append("https://www.googleapis.com/auth/calendar")
//Restore Previous Login if it exists
GIDSignIn.sharedInstance()?.restorePreviousSignIn()
GIDSignIn.sharedInstance()?.presentingViewController = UIApplication.shared.windows.last?.rootViewController
return button
func updateUIView(_ uiView: GIDSignInButton, context: UIViewRepresentableContext<google>)
任何帮助或信息将不胜感激!
【问题讨论】:
NavigationLink
可以通过编程方式激活,查找带有isActive
的构造函数,然后隐藏 - 使用EmptyView()
作为标签。
@Asperi,你的建议看起来不错。我是否理解正确:如果我将拥有@State var isActive
并像你写的那样使用它,我会自动到达目的地,同时再次打开这个视图(如果 var 当然是true
)?
@Александр-Грабовский,可以在this my answer看到NavigationLink的这种用法。
【参考方案1】:
我的身份验证/注册解决方案包括几个部分:
-
有一些可观察到的
final static class
数据,我可以从UserDefaults
获取。我认为您想保留一些数据并对其进行更改:
import SwiftUI
final class UserData: ObservableObject
@Published var userName: String?
didSet
UserDefaults.standard.set(userName, forKey: "userName")
init()
self.userName = UserDefaults.standard.string(forKey: "userName")
-
我的第一个
Home
视图有 UserData
的 EnvironmentObject
并将其设置在 SceneDelegate
类中:
class SceneDelegate: UIResponder, UIWindowSceneDelegate
// other staff
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
let homeView = Home()
.environmentObject(UserData())
// ...
// Use a UIHostingController as window root view controller.
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: homeView)
self.window = window
window.makeKeyAndVisible()
// ...
Home
视图显示 LoginPage
或 MainView
取决于 UserData
:
struct Home: View
@EnvironmentObject var userData: UserData
var body: some View
if self.userData.userName == nil
return AnyView(LoginPage())
else
return AnyView(MainView())
-
所以在这个解决方案中你只需要在
LoginPage
中设置userName
:
struct LoginPage: View
// your login view has the same user data, so user name changes for Home view too
@EnvironmentObject var userData: UserData
var body: some View
VStack
VLargeCardView(image: "pad22finalsf", category: "Login", heading: "Welcome to PV Pocket!", author: "PAD22")
//Google Sign In Button
google()
.frame(width: 200, height: 50)
// I don't know, how you get data, I didn't work with google. so quick code is:
.onTapGesture
// when you set userName, in Home view will show MainView at this moment
self.userData.userName = "Steve Jobs"
【讨论】:
以上是关于在 SwiftUI 中使用 google 帐户登录后是不是有任何改变视图的方法?的主要内容,如果未能解决你的问题,请参考以下文章
使用 SwiftUI、Combine 和 Firebase,我如何在将用户的帐户链接到电子邮件/密码之前验证用户是不是已匿名登录?