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

UIButton action(rx.tap) responds to different PublishSubjects with RxSwift

我想在 RxSwift 中为一个按钮绑定不同的动作。 我有绑定

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>()

有什么方法可以解绑第一个绑定吗?

编辑: 看来解绑是不可能的,但是感谢Daniel T。我找到了有效的解决方案。

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

        tap.filter { ![=14=] }
            .toVoid()
            .bind (to: viewModel.registrationPressed)
            .disposed(by: disposeBag)

        tap.filter { [=14=] }
            .toVoid()
            .bind(to: viewModel.registerPinPressed)
            .disposed(by: disposeBag)

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

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

tap.filter { [=10=] }
    .bind(to: viewModel.registrationPressed)
    .disposed(by: bag)

tap.filter { ![=10=] }
    .bind(to: viewModel.registerPinPressed)
    .disposed(by: bag)

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

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 { [=11=] == .registration }
    .bind(to: viewModel.registrationPressed)
    .disposed(by: bag)

tap.filter { [=11=] == .pin }
    .bind(to: viewModel.registerPinPressed)
    .disposed(by: bag)

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