Перемещение между представлениями в SwiftUI - PullRequest
0 голосов
/ 16 января 2020

хорошо, я в 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 ]

1 голос

Вы должны управлять представлениями в SwiftUI другим способом, вы не можете просто push или pop просматривать, как в 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
        }

    }

}
Вы можете использовать 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()
    }
}
0 голосов
/ 16 января 2020

Вы также можете добавить кнопку в NaigationView следующим образом.

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

                            }) {
                              Text("Log in!")
                            }
                        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...