今天,我试图在2个不同的视图之间导航,但是我想使用相同的视图来清除前一个视图中的信息。我创建了一个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()是带有使用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()
}
}
}
}
答案 0 :(得分:2)
我使用类似的技术显示登录视图,然后在用户登录后显示内容视图。这是您可以实现的一种方法:
创建一个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"
您可以使用环境对象在所有视图之间传递数据。