Перемещение между представлениями в SwiftUI

Хорошо, я на SwiftUI Xcode 11.3.1 пытаюсь вызвать второе представление после входа в систему

рабочий дизайн второго представления находится в файле mainView.swift

после входа в систему я так называю свою точку зрения

Button(action: {
                self.status =  dologin(username: self.username, password: self.password)
                if (self.status){
                    print ("log in succesfull")
                    mainMenu() // <-- return of "mainMenu" initializer is unused

                }
            })

Я знаю, что вы можете позвонить. subview, как .sheet(isPresented) но это не сработает для меня, потому что это экран входа в систему. заранее спасибо.

Всего 2 ответа


Вы должны управлять представлениями в SwiftUI другим способом, вы не можете просто push или всплыть, как в UIKit. Apple предлагает NavigationView и вы можете использовать что-то вроде NavigationLink(destination: YourLoginView(), isActive: $someBindingVariable, label: Text("")) , но мне действительно не нравится играть с .navigationBarHidden(true) и .navigationBarBackButtonHidden(true) и другой персонал. Есть несколько вариантов:

  1. Используйте .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
        }

    }

}
  1. Вы можете использовать операторы if...else , например:
//...
var body: some View {
    if needToLogin {
        return AnyView(LoginView)
    } else {
        return AnyView(MainView)
    }
    // something else in body
}
  1. Вы можете использовать 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()
    }
}

Вы также можете добавить кнопку в NaigationView, как это.

 NavigationLink(destination: mainMenu()) {
                            Button(action: {

                            }) {
                              Text("Log in!")
                            }
                        }

Есть идеи?

10000