Переключение между представлениями в SwiftUI в NavigationView
Сегодня я пытаюсь переключаться между двумя разными представлениями, но я хочу использовать одно и то же представление для очистки информации из предыдущего представления. Я создал MotherView для вызова двух разных представлений. Вот мой код
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() - это представление с анимацией с использованием Lottie, а 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 ответ
Я использую аналогичную технику, чтобы показать представление входа в систему, а затем представление содержимого после входа пользователя в систему. Вот способ, которым вы можете добиться этого:
Создайте 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"
Вы можете использовать объект среды для передачи данных между всеми вашими представлениями.