在 SwiftUI 中满足条件时显示新视图
Present a new view when a condition has been met in SwiftUI
大家好,我是 SwiftUI 的新手。我需要仅在检查条件后以模态呈现方式呈现包含两个文本字段的视图。
示例 .. 当用户按下登录按钮时,我需要应用程序检查数据库中是否存在用户。如果用户存在,他可以访问该应用程序,否则他必须显示一个视图,他必须在其中输入他的名字和姓氏。
With UIKit
我用它来呈现 structure
或 class
self.present(userFound ? Home() : UserNameInfo(), animated: true, completion: nil)
但是 SwiftUI
我不知道如何解决这个问题。
你能帮我什么忙吗?
我的代码
var body: some View {
ZStack(alignment: .top) {
Color(.black).ignoresSafeArea()
gradientBackground().ignoresSafeArea()
VStack(alignment: .center, spacing: 25) {
Spacer()
logoStack()
// Messaggio di benvenuto
VStack(alignment: .leading, spacing: 15) {
Text("Effettua l'accesso al tuo account")
.font(.title2.bold())
Text("Riserva un momento esclusivo prenotando un taglio tradizionale oppure una rasatura con panni caldi e trattamenti viso")
.font(.callout.weight(.light))
}
.foregroundColor(.white)
//.dynamicTypeSize(.medium)
// Apple Sign In Button
SignInWithAppleView()
.frame(width: screen.size.width - 56)
.frame(height: 45, alignment: .center)
.onTapGesture(perform: showAppleLoginView)
// Divisore
Divider().background(.gray)
// Messaggio sull'accettazione della Privacy e delle Condizioni di utilizzo
VStack(spacing: 5) {
Text("Continuando dichiaro di accettare le ")
.multilineTextAlignment(.center)
HStack(spacing: 0) {
Button("Condizioni di Utilizzo") {}
.foregroundColor(.white)
.font(.footnote.bold())
Text(" ed i ")
Button("Termini sulla Privacy") {}
.foregroundColor(.white)
.font(.footnote.bold())
Text(".")
}
}
.foregroundColor(.gray)
.font(.footnote)
.padding(.bottom, 25)
}
.padding(.horizontal)
}
private func showAppleLoginView() {
// Show modalview if user not exist in Firebase
}
// MARK: - Apple Sign In Button View Representable
struct SignInWithAppleView: UIViewRepresentable {
typealias UIViewType = ASAuthorizationAppleIDButton
func makeUIView(context: Context) -> UIViewType {
ASAuthorizationAppleIDButton(type: .signIn, style: .white)
}
func updateUIView(_ uiView: UIViewType, context: Context) {}
}
您可以使用修饰符 .fullScreenCover
& 您只需要将绑定传递给 @State var
,当您想要显示模式时将其设置为 true。
例子
struct ExampleScreenView: View {
@State var showModal: Bool = false
var body: some View {
VStack {
Text("Some Text")
.padding()
Button {
showModal = true
} label: {
Text("Show other view")
}
}
.fullScreenCover(isPresented: $showModal) {
VStack {
Color.white
Text("Some other text")
.padding()
Button {
showModal = false
} label: {
Text("close view")
}
}
}
}
}
这个例子中第一个视图有一个按钮将 bool 设置为 true,并显示模态,模态视图有一个按钮将 bool 设置为 false 并关闭视图。
按钮只是为了示例,但您可以使用任何逻辑来设置布尔值。设置为 true,然后您就可以在 fullScreenCover 中呈现您选择的任何视图。
针对登录场景,可以使用.onReceive
修饰符监听登录成功代码发送的通知。
.onReceive(NotificationCenter.default.publisher(for: Notification.Name(rawValue: "didLogin"))
&
NotificationCenter.post(name:Notification.Name("didLogin"), object: nil)
大家好,我是 SwiftUI 的新手。我需要仅在检查条件后以模态呈现方式呈现包含两个文本字段的视图。
示例 .. 当用户按下登录按钮时,我需要应用程序检查数据库中是否存在用户。如果用户存在,他可以访问该应用程序,否则他必须显示一个视图,他必须在其中输入他的名字和姓氏。
With UIKit
我用它来呈现 structure
或 class
self.present(userFound ? Home() : UserNameInfo(), animated: true, completion: nil)
但是 SwiftUI
我不知道如何解决这个问题。
你能帮我什么忙吗?
我的代码
var body: some View {
ZStack(alignment: .top) {
Color(.black).ignoresSafeArea()
gradientBackground().ignoresSafeArea()
VStack(alignment: .center, spacing: 25) {
Spacer()
logoStack()
// Messaggio di benvenuto
VStack(alignment: .leading, spacing: 15) {
Text("Effettua l'accesso al tuo account")
.font(.title2.bold())
Text("Riserva un momento esclusivo prenotando un taglio tradizionale oppure una rasatura con panni caldi e trattamenti viso")
.font(.callout.weight(.light))
}
.foregroundColor(.white)
//.dynamicTypeSize(.medium)
// Apple Sign In Button
SignInWithAppleView()
.frame(width: screen.size.width - 56)
.frame(height: 45, alignment: .center)
.onTapGesture(perform: showAppleLoginView)
// Divisore
Divider().background(.gray)
// Messaggio sull'accettazione della Privacy e delle Condizioni di utilizzo
VStack(spacing: 5) {
Text("Continuando dichiaro di accettare le ")
.multilineTextAlignment(.center)
HStack(spacing: 0) {
Button("Condizioni di Utilizzo") {}
.foregroundColor(.white)
.font(.footnote.bold())
Text(" ed i ")
Button("Termini sulla Privacy") {}
.foregroundColor(.white)
.font(.footnote.bold())
Text(".")
}
}
.foregroundColor(.gray)
.font(.footnote)
.padding(.bottom, 25)
}
.padding(.horizontal)
}
private func showAppleLoginView() {
// Show modalview if user not exist in Firebase
}
// MARK: - Apple Sign In Button View Representable
struct SignInWithAppleView: UIViewRepresentable {
typealias UIViewType = ASAuthorizationAppleIDButton
func makeUIView(context: Context) -> UIViewType {
ASAuthorizationAppleIDButton(type: .signIn, style: .white)
}
func updateUIView(_ uiView: UIViewType, context: Context) {}
}
您可以使用修饰符 .fullScreenCover
& 您只需要将绑定传递给 @State var
,当您想要显示模式时将其设置为 true。
例子
struct ExampleScreenView: View {
@State var showModal: Bool = false
var body: some View {
VStack {
Text("Some Text")
.padding()
Button {
showModal = true
} label: {
Text("Show other view")
}
}
.fullScreenCover(isPresented: $showModal) {
VStack {
Color.white
Text("Some other text")
.padding()
Button {
showModal = false
} label: {
Text("close view")
}
}
}
}
}
这个例子中第一个视图有一个按钮将 bool 设置为 true,并显示模态,模态视图有一个按钮将 bool 设置为 false 并关闭视图。
按钮只是为了示例,但您可以使用任何逻辑来设置布尔值。设置为 true,然后您就可以在 fullScreenCover 中呈现您选择的任何视图。
针对登录场景,可以使用.onReceive
修饰符监听登录成功代码发送的通知。
.onReceive(NotificationCenter.default.publisher(for: Notification.Name(rawValue: "didLogin"))
&
NotificationCenter.post(name:Notification.Name("didLogin"), object: nil)