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