我想在 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/