私のアプリでは、ピッカーのコレクションがあります。各ピッカーは、その値をサービスから取得します。あなたはUIStackView
に配置されているより多くのピッカーを追加するadd picker
をタップすることができRxSwift - 使用可能な要素を削除してみる
--------------------
- picker 1 -
--------------------
- add picker -
--------------------
:
アプリのレイアウトは次のようになります。各ピッカーはUIViewController
によってサポートされ、独自のviewModelを持ち、コンテナビューコントローラにはviewModelもあります。
あなたはadd picker
いくつかの回をタップした後、あなたはこのような何かを得る:
--------------------
- picker 1 -
--------------------
- picker 2 -
--------------------
- picker 3 -
--------------------
あなたは、各ピッカーをタップすると、私は、ユーザーにオプションのセットを表示します。オプションセットは、ビューモデルで囲まれたWebサービスのもので、Observable<OperationType>
にあります。
サービスがoption 1
、option 2
、option 3
を返して言うと、ユーザーは最初のピッカーのためのoption 1
をピックアップ、私は2番目のピッカーが開いたときにのみ、ユーザーoption 2
とoption 3
を提供することが必要です。
は、私はこのコードを持っている私のメインビューモデルでは:
var children = Variable<[ChildViewModel]>([])
var allAvailableOperationTypes: Observable<[OperationType]> {
return RequestManager.sharedInstance.rx
.catalogues()
.asObservable()
.map { return $0.operationTypes }
}
}
私はその後allAvailableOperationTypes
から最後の値を組み合わせて処理するために新しいObservable
を作成し、既に選択されているものを「削除」。ユーザーが最初にピッカー上の値を選択して、追加した場合
operationTypeButton.rx.tap
.asObservable()
.withLatestFrom(viewModel.availableOperationTypes)
.subscribe(onNext: { [unowned self] (operationTypes) in
self.presentPicker(forOperationTypes: operationTypes)
})
.addDisposableTo(disposeBag)
:
ような何か:ビューコントローラ上の
var availableOperationTypes: Observable<[OperationType]> {
return allAvailablePriceOperationTypes
.map { (operationTypes) in
operationTypes.filter { // keep those not used in children }
}
}
}
、私は次のようにボタンにバインドしています2番目のピッカーは「無料」オプションのみを含みます。ただし、最初のピッカーは利用可能なすべてのオプションを表示します。
私が達成したいのは、ユーザーがピッカーボタンをタップしたときに彼が選ぶことができるオプションだけを示すように、これが熱くなることです。
ChildViewModelには、現在の値を格納する変数があります。したがって、私は観察可能な変数を持っています。 ピッカーに関しては、以前のピッカーは「生きている」ままです。最初のピッカーが1を選択し、2番目のピッカーが最初のピッカーを再びタップすると、3を選択できるようにしたいとします。 – pgb