简体   繁体   English

SwiftUI - EnvironmentObject 已发布 var 到 NavigationLink 的选择?

[英]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.

相关问题 SwiftUI iOS 14 视图不会使用 @EnvironmentObject 更新 @Published 数组 - SwiftUI iOS 14 View does not Update @Published Array with @EnvironmentObject 当 SwiftUI 选择器选择更改 EnvironmentObject 时,有没有办法调用 function? - Is there a way to call a function when a SwiftUI Picker selection changes an EnvironmentObject? `SwiftUI` - `EnvironmentObject`s,`EnvironmentValues` 不会传播到模态呈现的 `UIViewController` - `SwiftUI` - `EnvironmentObject`s, `EnvironmentValues` does not propagate to modally presented `UIViewController` SwiftUI 将 EnvironmentObject 传递给 class - SwiftUI Pass EnvironmentObject to a class 在SwiftUI中将@EnvironmentObject与PresentationButton一起使用 - Use @EnvironmentObject with PresentationButton in SwiftUI SwiftUI 将@Published var 从一个 ObservableObject 映射到另一个 - SwiftUI map @Published var from one ObservableObject to another SwiftUI/iOS 15:fullScreenCover 不会解除绑定已发布的 var - SwiftUI/iOS 15: fullScreenCover not dismissing with binding on published var 在 Firebase 中设置 @Published var 完成块未更新 SwiftUI 视图 - Setting @Published var in Firebase Completion Block Not Updating SwiftUI View SwiftUI MVVM 已发布 var 未在不同视图之间更新 - SwiftUI MVVM published var is not updating between different views SwiftUI 在 NavigationLink 中隐藏箭头 - SwiftUI hide the arrow in NavigationLink
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM