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

时间:2018-08-20 15:04:04

标签: ios iphone data-binding uibutton rx-swift

我想为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 { !$0 }
            .toVoid()
            .bind (to: viewModel.registrationPressed)
            .disposed(by: disposeBag)

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

1 个答案:

答案 0 :(得分:1)

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

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)

这是一种更具自我证明的方法:

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,但是在不了解上下文的情况下,这是我所能做到的。