[英]issue with having rx.tap for UIButton in UICollectionViewCell - RxSwift 3
[英]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.