在 NavigationView 中的 SwiftUI 视图之间切换
Change between views on SwiftUI within NavigationView
今天,我试图在 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())
}
}
这是我的启动画面:
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()。
这可能吗?谢谢!
这是此代码的最后一次更新(我收到此错误:"Argument type '()' does not conform to expected type 'View'")
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()
}
}
}
}
我使用类似的技术来显示登录视图,然后是用户登录后的内容视图。您可以通过以下方式实现:
创建一个 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"
您可以使用环境对象在所有视图之间传递数据。
今天,我试图在 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())
}
}
这是我的启动画面:
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()。
这可能吗?谢谢!
这是此代码的最后一次更新(我收到此错误:"Argument type '()' does not conform to expected type 'View'")
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()
}
}
}
}
我使用类似的技术来显示登录视图,然后是用户登录后的内容视图。您可以通过以下方式实现:
创建一个 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"
您可以使用环境对象在所有视图之间传递数据。