我一生无法弄清楚如何仅在ObservedObject
中的某个属性发生变化以满足条件的情况下进行导航。例如,当我的状态更改为某种状态时,请导航至下一个屏幕。
我在tag
上使用了selection
和NavigationLink
初始值设定项,但它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>
。
答案 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!})
}}
}
}
}
}