[英]SwiftUI - EnvironmentObject Published var to NavigationLink's Selection?
I have a class I use as EnvironmentObject with a screen
variable I want to use to control what screen the user is in. I use network calls to change this value, expiration seconds to move to another view, so I need my NavigationView to move to the adequate screen when this value changes.我有一个 class 我用作 EnvironmentObject 和一个screen
变量,我想用它来控制用户所在的屏幕。我使用网络调用来更改这个值,过期秒数移动到另一个视图,所以我需要我的 NavigationView 移动到此值更改时的适当屏幕。
For the class I have something like this:对于 class 我有这样的东西:
class MyClass: NSObject, ObservableObject {
@Published var screen: String? = "main"
}
And for the main view I have something like this:对于主要观点,我有这样的事情:
struct ContentView: View {
@EnvironmentObject var myClass: MyClass
var body: some View {
ZStack {
NavigationView() {
NavigationLink(destination: MainView(), tag: "main", selection: self.$myClass.screen)
{
EmptyView()
}
}
}
}
}
I don't seem to be able to work this way.我似乎无法以这种方式工作。
As a workaround I have done:作为一种解决方法,我已经做了:
struct ContentView: View {
@EnvironmentObject var myClass: MyClass
var body: some View {
VStack {
if (self.myClass.screen == "main") {
MainView()
} else if (self.myClass.screen == "detail") {
DetailView()
}
}
}
But as you see, is not pretty.但如你所见,并不漂亮。 And I don't get any animations when changing screens.而且我在更换屏幕时没有任何动画。
Does anyone have an idea how to do this or how should I approach this situation?有谁知道如何做到这一点或我应该如何处理这种情况?
Your second approach is correct.你的第二种方法是正确的。 You just need animations.你只需要动画。 Unfortunately they only work when changing @State
variables.不幸的是,它们仅在更改@State
变量时才有效。
For this you need to create a new @State
variable and assign it in .onReceive
:为此,您需要创建一个新的@State
变量并将其分配给.onReceive
:
struct ContentView: View {
@EnvironmentObject var myClass: MyClass
@State var screen: String?
var body: some View {
VStack {
if screen == "main" {
MainView()
} else if screen == "detail" {
DetailView()
}
}
.onReceive(myClass.$screen) { screen in
withAnimation {
self.screen = screen
}
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.