ios - UIButton action(rx.tap) 用 RxSwift 响应不同的 PublishSubjects

标签 ios iphone data-binding uibutton rx-swift

我想在 RxSwift 中为一个按钮绑定(bind)不同的操作。 我有绑定(bind)

registerButton.rx.tap
            .map { self.registerButton.isEnabled = false }
            .bind(to: viewModel.registrationPressed)
            .disposed(by: disposeBag)

想切换到

self.registerButton.rx.tap
        .map { self.registerButton.isEnabled = false }
        .bind(to: viewModel.registerPinPressed)
        .disposed(by: disposeBag)

let registrationPressed = PublishSubject<Void>()
let registerPinPressed = PublishSubject<Void>()

有没有办法解绑第一个绑定(bind)?

编辑: 似乎无法解除绑定(bind),但感谢 Daniel T。我找到了有效的解决方案。

let tap = registerButton.rx.tap
            .map { _ in
                self.isFormProcessed
            }

        tap.filter { !$0 }
            .toVoid()
            .bind (to: viewModel.registrationPressed)
            .disposed(by: disposeBag)

        tap.filter { $0 }
            .toVoid()
            .bind(to: viewModel.registerPinPressed)
            .disposed(by: disposeBag)

最佳答案

听起来您想要做的是让按钮点击在两个不同的流之间交替。这是一种方法。我希望还有很多其他人:

let tap = registerButton.rx.tap
    .map { 1 }
    .scan(0) { $0 + $1 }
    .map { $0 % 2 == 0 }

tap.filter { $0 }
    .bind(to: viewModel.registrationPressed)
    .disposed(by: bag)

tap.filter { !$0 }
    .bind(to: viewModel.registerPinPressed)
    .disposed(by: bag)

这里有一个更 self 记录的方法:

enum WhichStream {
    case registration
    case pin
}

let tap = registerButton.rx.tap
    .scan(WhichStream.pin) { last, _ in
        switch last {
        case .pin:
            return .registration
        case .registration:
            return .pin
        }
    }

tap.filter { $0 == .registration }
    .bind(to: viewModel.registrationPressed)
    .disposed(by: bag)

tap.filter { $0 == .pin }
    .bind(to: viewModel.registerPinPressed)
    .disposed(by: bag)

可能有一个更好的解决方案,它根本不涉及 PublishSubjects,但在不知道上下文的情况下,这是我所能做的。

关于ios - UIButton action(rx.tap) 用 RxSwift 响应不同的 PublishSubjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51933595/

相关文章:

ios - 无法从 ekstore 查询日历中的提醒

ios - iOS (Objective-C) 在 AudioQueue 中播放 AAC 文件的问题

iphone - 返回选项卡后自定义导航栏无法正确显示

iphone - 计算最近点的有效方法是什么?

xaml - ListView MVVM内TextBox上的UWP InvokeCommandAction

ios - iCloud 存储权利和越狱

iphone - SDWebImage 未运行

c# - XAML 嵌套模板绑定(bind)

iphone - 异步 iOS 网络库设计

data-binding - WindowsRT 数据绑定(bind)如何在没有 TypeConverterAttribute 的情况下进行类型转换