Вы должны управлять представлениями в SwiftUI другим способом, вы не можете просто push
или pop
просматривать, как в UIKit. Apple предлагает NavigationView
, и вы можете использовать что-то вроде NavigationLink(destination: YourLoginView(), isActive: $someBindingVariable, label: Text(""))
, но я действительно не люблю играть с .navigationBarHidden(true)
и .navigationBarBackButtonHidden(true)
и другим персоналом. Есть несколько вариантов:
- Использовать
.popover(isPresented: $needToLogin) { // login view }
. Либо вы можете использовать .sheet
. В этом случае пользователь может переместить ваш «Вид входа в систему» вниз и использовать «Основной вид» как обычно:
struct MovingViewsSwiftUI: View {
@State private var needToLogin = true
var body: some View {
Rectangle() // your "Main view"
.popover(isPresented: $needToLogin) {
LoginView(needToLogin: self.$needToLogin) // will show you at the end
}
}
}
Вы можете использовать
if...else
операторы, например:
//...
var body: some View {
if needToLogin {
return AnyView(LoginView)
} else {
return AnyView(MainView)
}
// something else in body
}
Вы можете использовать
ZStack
и управлять представлениями
.opacity
или
.offset
. Это позволяет вам создавать интересные анимации:
struct MovingViewsSwiftUI: View {
@State private var needToLogin = true
var body: some View {
ZStack {
LoginView(needToLogin: $needToLogin)
.opacity(needToLogin ? 1 : 0)
Rectangle()
.opacity(needToLogin ? 0 : 1)
}
}
}
и вот пример LoginView
:
struct LoginView: View {
@Binding var needToLogin: Bool
@State private var email: String = ""
@State private var password: String = ""
var body: some View {
VStack {
TextField("enter email", text: $email)
TextField("pass", text: $password)
Button(action: {
withAnimation {
self.needToLogin = false
}
}) {
Text("Log in!")
}
}
.padding()
}
}