ios - RxSwift - Observable 删除使用过的元素

标签 ios swift rx-swift

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

应用程序布局如下所示:

--------------------
-    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 2option 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/

相关文章:

ios - Xcode 意外删除了对文件的引用

ios - 从 PFObject 中检索值

iOS - 在图像上绘画 - 应用蒙版

swift - 在 API 调用期间从服务器获取错误消息

swift - 在 RxSwift getter 函数中使用 Swift 泛型——各种问题

ios - 无法在 Ad-Hoc 模式下编译 iOS-App (Xamarin.iOS)

ios - iOS8 中 iPhone 应用程序启动图像的大小和命名

ios - 使用 Star Image 为 UIButton 设置边框

ios - 如何限制文本字段输入的长度 - Swift 2

ios - RxSwift+Moya+Moya_ObjectMapper+MJRefresh,刷新失败?