RxSwift - 可观察删除使用过的元素

时间:2017-10-20 22:30:54

标签: ios swift rx-swift

在我的应用程序中,我有一系列选择器。每个选择器都从服务中获取其值。

应用布局如下所示:

rectItem = CustGraphicsRectItem(rect, self.drawMode)

您可以点按-------------------- - picker 1 - -------------------- - add picker - -------------------- 添加更多选择器,这些选择器位于add picker中。每个选择器都由其UIStackView支持并具有自己的viewModel,而容器视图控制器也具有viewModel。

点击UIViewController一段时间后,你会得到类似的结果:

add picker

当您点按每个选择器时,我会向用户显示一组选项。这组选项来自一个Web服务,它由-------------------- - picker 1 - -------------------- - picker 2 - -------------------- - picker 3 - -------------------- 中的视图模型包装。

假设服务返回Observable<OperationType>option 1option 2,并且用户为第一个选择器选择option 3,我需要在第二个选择器打开时才提供用户option 1option 2

在我的主视图模型中,我有这段代码:

option 3

然后,我创建了一个新的 var children = Variable<[ChildViewModel]>([]) var allAvailableOperationTypes: Observable<[OperationType]> { return RequestManager.sharedInstance.rx .catalogues() .asObservable() .map { return $0.operationTypes } } } 来处理Observable的最后一个值和“删除”已选择的值。

类似的东西:

allAvailableOperationTypes

在View Controller上,我将它绑定到按钮,如:

var availableOperationTypes: Observable<[OperationType]> {
    return allAvailablePriceOperationTypes
        .map { (operationTypes) in
            operationTypes.filter { // keep those not used in children }
          }
    }
}

如果用户在第一个选择器上选择一个值,然后再添加第二个选择器,则第二个选择器将仅包含“free”选项。但是,第一个选择器仍将显示所有可用选项。

我想要实现的目标是热,这样当用户点击选择器按钮时,它只会显示他可以选择的选项。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望UIPickerView显示所有可用选项,直到另一个选项打开,此时先前活动的选择器应折叠到当前选定的值。这意味着您的选择器视图模型应该提供一个Observable,告诉他们当前是否处于活动状态。然后,选择器视图模型应filter allAvailableOperationTypes Observable,这是您应该将选择器绑定到的。

这里的要点是,选择器的值也应该绑定到Observable,而不是静态设置。从你的例子来看,目前尚不清楚是否已经如此。