SwiftUI перейти при изменении свойства ObservedObject - PullRequest
0 голосов
/ 28 октября 2019

Я не могу понять, как ориентироваться, только если свойство из моего ObservedObject изменяется в соответствии с условием. то есть когда мое состояние меняется на какое-то состояние, перейдите к следующему экрану.

Я использовал инициализатор tag и selection на NavigationLink, но для selection требуется Binding,и я не могу получить Binding из свойств моего 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>, я получаю ошибку: Generic parameter Subject cannot be inferred.

Ответы [ 2 ]

2 голосов
/ 28 октября 2019

просто удалите private(set) в вашей модели, NavigationLink установит для shouldNavigate значение false после завершения навигации, поэтому оно не должно быть private(set)

public final class Store<Value, Action>: ObservableObject {
    @Published public var value: Value
}
0 голосов
/ 28 октября 2019

Я покажу вам важное промежуточное решение перед дженериками. Я думаю, что ключ здесь в том, что 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!})
                }}
        }
        }
    }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...