如果ObservedObject属性更改,则SwiftUI导航

时间:2019-10-28 01:28:00

标签: swift swiftui

我一生无法弄清楚如何仅在ObservedObject中的某个属性发生变化以满足条件的情况下进行导航。例如,当我的状态更改为某种状态时,请导航至下一个屏幕。

我在tag上使用了selectionNavigationLink初始值设定项,但它selection需要一个Binding,并且我不能派生一个{来自Binding上属性的{1}},而没有使用ObservedObject上的.constant()初始化程序,这只是一个不变的值。

Binding

人们还如何实现仅在满足其状态的条件时才进行导航的按钮?我试图避免使用@ObservedObject var store: Store<AppState, AppValue> NavigationLink( destination: SecondView(), tag: true, selection: store.shouldNavigate // Can't do this because I need a binding ) ,因为我希望导航依赖于我的应用程序状态,而不取决于我基于某种业务逻辑切换的本地状态

@State

更新:

所以看来我应该能够创建绑定,但是由于public final class Store<Value, Action>: ObservableObject { @Published public private(set) var value: Value } 给了我store.value,所以我得到了一个错误:Binding<Value>

2 个答案:

答案 0 :(得分:2)

只需删除模型中的private(set),导航完成后NavigationLink会将shouldNavigate设置为false,因此不应为private(set)

public final class Store<Value, Action>: ObservableObject {
    @Published public var value: Value
}

答案 1 :(得分:0)

我向您展示了泛型之前的重要中间解决方案。我认为这里的关键是selection binding需要optional绑定。那是最麻烦的。

            enum AppState: String{
        case none = "none"
        case red = "red"
        case blue = "blue"
        case green = "green"
        case purple = "purple"
    }


    enum AppValue: String{
        case none
    }

    public final class Store<V, A>: ObservableObject {
        @Published  var value: AppState? = AppState.none
       public var link :Color = Color.white
        init(value: AppState = .none,  link : Color = Color.white){
            self.link = link
            self.value = value
        }
    }

     struct TestView: View {
        @ObservedObject var store: Store<AppState?, AppValue>

        var viewStates: [Store<AppState?,AppValue>] =
            [Store(value: .red, link: Color.red),
             Store(value: .blue, link: Color.blue) ,
             Store(value: .green, link: Color.green),
             Store(value: .purple, link: Color.purple)  ]

    var body: some View {
    NavigationView{
        VStack{
            ForEach(viewStates, id: \.value){ s in
                Group{
                NavigationLink(destination: s.link, tag: s.value!, selection: self.$store.value ){EmptyView()}
                    Button( s.value!.rawValue, action: {
                    self.store.value = s.value!})
                }}
        }
        }
    }
    }