在我的应用程序中,我有一组选择器。每个选择器都从服务中获取其值。
应用程序布局如下所示:
--------------------
- picker 1 -
--------------------
- add picker -
--------------------
您可以点击add picker
添加更多选择器,将其放置在 UIStackView
中。每个选择器都由其 UIViewController
支持并且有自己的viewModel,而容器 View Controller 也有一个viewModel。
点击 add picker
后有时,你会得到这样的信息:
--------------------
- picker 1 -
--------------------
- picker 2 -
--------------------
- picker 3 -
--------------------
当您点击每个选择器时,我会向用户显示一组选项。这组选项来自一个 Web 服务,该服务由 View 模型包装在 Observable<OperationType>
中。 .
假设服务返回 option 1
, option 2
, option 3
,用户选择 option 1
对于第一个选择器,我需要当第二个选择器打开时仅向用户提供 option 2
和option 3
.
在我的主视图模型中,我有以下代码:
var children = Variable<[ChildViewModel]>([])
var allAvailableOperationTypes: Observable<[OperationType]> {
return RequestManager.sharedInstance.rx
.catalogues()
.asObservable()
.map { return $0.operationTypes }
}
}
然后我创建了一个新的 Observable
处理组合 allAvailableOperationTypes
中的最后一个值并“删除”已选择的。
类似于:
var availableOperationTypes: Observable<[OperationType]> {
return allAvailablePriceOperationTypes
.map { (operationTypes) in
operationTypes.filter { // keep those not used in children }
}
}
}
在 View Controller 上,我将其绑定(bind)到按钮,例如:
operationTypeButton.rx.tap
.asObservable()
.withLatestFrom(viewModel.availableOperationTypes)
.subscribe(onNext: { [unowned self] (operationTypes) in
self.presentPicker(forOperationTypes: operationTypes)
})
.addDisposableTo(disposeBag)
如果用户在第一个选择器上选择一个值,然后添加第二个值,则第二个选择器将仅包含“免费”选项。但是,第一个选择器仍会显示所有可用选项。
我想要实现的目标是让它变得热门,这样当用户点击选择器按钮时,它只显示他可以选择的选项。
最佳答案
如果我理解正确,您希望 UIPickerView 显示所有可用选项,直到另一个选项打开,此时先前事件的选择器应折叠到当前选定的值。这意味着您的选择器 View 模型应该提供一个 Observable 来告诉它们当前是否处于事件状态。然后,选择器 View 模型应该过滤
您的allAvailableOperationTypes
Observable,这是您应该将选择器绑定(bind)到的内容。
这里的要点是选择器的值也应该绑定(bind)到 Observable,而不是静态设置。从您的示例来看,尚不清楚情况是否已经如此。
关于ios - RxSwift - Observable 删除使用过的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46858186/