2017-10-20 7 views
0

私のアプリでは、ピッカーのコレクションがあります。各ピッカーは、その値をサービスから取得します。あなたはUIStackViewに配置されているより多くのピッカーを追加するadd pickerをタップすることができRxSwift - 使用可能な要素を削除してみる

-------------------- 
- picker 1  - 
-------------------- 
- add picker - 
-------------------- 

アプリのレイアウトは次のようになります。各ピッカーはUIViewControllerによってサポートされ、独自のviewModelを持ち、コンテナビューコントローラにはviewModelもあります。

あなたはadd pickerいくつかの回をタップした後、あなたはこのような何かを得る:

-------------------- 
- picker 1  - 
-------------------- 
- picker 2  - 
-------------------- 
- picker 3  - 
-------------------- 

あなたは、各ピッカーをタップすると、私は、ユーザーにオプションのセットを表示します。オプションセットは、ビューモデルで囲まれたWebサービスのもので、Observable<OperationType>にあります。

サービスがoption 1option 2option 3を返して言うと、ユーザーは最初のピッカーのためのoption 1をピックアップ、私は2番目のピッカーが開いたときにのみ、ユーザーoption 2option 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番目のピッカーは「無料」オプションのみを含みます。ただし、最初のピッカーは利用可能なすべてのオプションを表示します。

私が達成したいのは、ユーザーがピッカーボタンをタップしたときに彼が選ぶことができるオプションだけを示すように、これが熱くなることです。

答えて

0

私が正しく理解していれば、別のものが開くまで、使用可能なすべてのオプションが表示され、その時点で以前にアクティブなピッカーが現在選択されている値に崩壊する必要があります。これは、ピッカーのビューモデルに、現在アクティブであるかどうかを示すObservableを提供する必要があることを意味します。ピッカーのビューモデルは、filterallAvailableOperationTypes Observableである必要があります。これは、ピッカーをバインドする必要があります。

ここで重要な点は、ピッカーの値がObservableにもバインドされ、静的に設定されていないことです。あなたの例から、これがすでにそうであるかどうかは明らかではありません。

+0

ChildViewModelには、現在の値を格納する変数があります。したがって、私は観察可能な変数を持っています。 ピッカーに関しては、以前のピッカーは「生きている」ままです。最初のピッカーが1を選択し、2番目のピッカーが最初のピッカーを再びタップすると、3を選択できるようにしたいとします。 – pgb

関連する問題