【发布时间】:2017-10-20 22:30:53
【问题描述】:
在我的应用程序中,我有一组选择器。每个选择器都从服务中获取其值。
应用布局如下所示:
--------------------
- picker 1 -
--------------------
- add picker -
--------------------
您可以点按add picker 来添加更多选择器,这些选择器放置在UIStackView 中。每个选择器都由其UIViewController 支持并拥有自己的viewModel,而容器视图控制器也有一个viewModel。
点击add picker 几次后,您会得到如下信息:
--------------------
- picker 1 -
--------------------
- picker 2 -
--------------------
- picker 3 -
--------------------
当您点击每个选择器时,我会向用户显示一组选项。选项集来自一个 Web 服务,该服务由 View Model 包装在 Observable<OperationType> 中。
假设服务返回option 1、option 2、option 3,并且用户为第一个选择器选择option 1,我需要在第二个选择器打开时仅向用户提供option 2 和@987654333 @。
在我的主视图模型中,我有以下代码:
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 }
}
}
}
在视图控制器上,我将它绑定到按钮上:
operationTypeButton.rx.tap
.asObservable()
.withLatestFrom(viewModel.availableOperationTypes)
.subscribe(onNext: { [unowned self] (operationTypes) in
self.presentPicker(forOperationTypes: operationTypes)
})
.addDisposableTo(disposeBag)
如果用户在第一个选择器上选择了一个值,然后添加了第二个,则第二个选择器将只包含“免费”选项。但是,第一个选择器仍会显示所有可用选项。
我想要实现的是让它变热,这样当用户点击选择器按钮时,它只显示他可以选择的选项。
【问题讨论】: