Переключение между представлениями SwiftUI в NavigationView - PullRequest
0 голосов
/ 29 января 2020

сегодня я пытаюсь перемещаться между двумя разными представлениями, но хочу использовать один и тот же вид, чтобы очистить информацию от предыдущего представления. Я создал MotherView для вызова 2 разных представлений. Вот мой код

import SwiftUI

struct MotherView: View {
    @ObservedObject var viewRouter: ViewRouter

    var body: some View {

        VStack {
            if viewRouter.currentPage == "splash" {
                SplashView()
            } else{
                ContentView()
            }
        }
    }
}


struct MotherView_Previews : PreviewProvider {
    static var previews: some View {
        MotherView(viewRouter: ViewRouter())
    }
}

Это мой SplashScreen:

    struct SplashView: View {
    @State private var isAnimated = true
    @EnvironmentObject var pageSettings: PageSettings

    var body: some View {
            VStack{

                LottieView(filename:"Logo")
                pageSettings.currentPage = "content"
            }
    }


}

ПРИМЕЧАНИЕ. SplashView () - это представление с анимацией с использованием Lott ie, а ContentView () - это представление с моим авторизоваться. Я хочу запустить свое приложение, используя мой SplashView (), а затем очистить VStack и запустить ContentView ().

Возможно ли это? Спасибо!

Это последнее обновление из этого кода (я получил эту ошибку: «Тип аргумента« () »не соответствует ожидаемому типу« Представление »)

    struct SplashView: View {
    @State private var animated = false
    @EnvironmentObject var pageSettings: PageSettings
    var body: some View {
        VStack{
            if self.animated{
                pageSettings.currentPage = "content"
            }else{
                LottieView()
            }
        }
    }
}

1 Ответ

2 голосов
/ 30 января 2020

Я использую аналогичную технику c, чтобы показать представление входа в систему, а затем представление содержимого после входа пользователя. Вот способ, которым вы можете достичь этого:

Создать ObservableObject

class pageSettings: ObservableObject {
    @Published var currentPage: String = "splash"
}

Измените свой SceneDelegate

Добавьте следующую строку после var window: UIWindow?:

var pageSettings = PageSettings()

Затем замените вызов UIHostingController:

window.rootViewController = UIHostingController(rootView: contentView)

по этому вызову:

window.rootViewController = UIHostingController(rootView: contentView.environmentObject(pageSettings))

Используйте свой ObservableObject

Внутри MotherView, добавьте это свойство:

@EnvironmentObject var pageSettings: PageSettings

Замените ваш тест следующим:

if pageSettings.currentPage == "splash" 

Внутри SplashScreen

Вам также необходимо позвонить на EnvironmentObject. Затем вы можете обновить значение currentPage следующим образом (оно мгновенно переключит представление):

pageSettings.currentPage = "content"

Вы можете использовать объект среды для передачи данных между всеми вашими представлениями.

...