簡體   English   中英

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 { !$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)

這是一種更自我記錄的方法:

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,但在不知道上下文的情況下,這是我所能做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM