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 { ![=14=] }
.toVoid()
.bind (to: viewModel.registrationPressed)
.disposed(by: disposeBag)
tap.filter { [=14=] }
.toVoid()
.bind(to: viewModel.registerPinPressed)
.disposed(by: disposeBag)
听起来你想要做的是让按钮点击在两个不同的流之间交替。这是一种方法。我希望还有很多其他人:
let tap = registerButton.rx.tap
.map { 1 }
.scan(0) { [=10=] + }
.map { [=10=] % 2 == 0 }
tap.filter { [=10=] }
.bind(to: viewModel.registrationPressed)
.disposed(by: bag)
tap.filter { ![=10=] }
.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 { [=11=] == .registration }
.bind(to: viewModel.registrationPressed)
.disposed(by: bag)
tap.filter { [=11=] == .pin }
.bind(to: viewModel.registerPinPressed)
.disposed(by: bag)
可能有一个更好的解决方案,它根本不涉及 PublishSubjects,但在不知道上下文的情况下,这是我所能做的。
我想在 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 { ![=14=] }
.toVoid()
.bind (to: viewModel.registrationPressed)
.disposed(by: disposeBag)
tap.filter { [=14=] }
.toVoid()
.bind(to: viewModel.registerPinPressed)
.disposed(by: disposeBag)
听起来你想要做的是让按钮点击在两个不同的流之间交替。这是一种方法。我希望还有很多其他人:
let tap = registerButton.rx.tap
.map { 1 }
.scan(0) { [=10=] + }
.map { [=10=] % 2 == 0 }
tap.filter { [=10=] }
.bind(to: viewModel.registrationPressed)
.disposed(by: bag)
tap.filter { ![=10=] }
.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 { [=11=] == .registration }
.bind(to: viewModel.registrationPressed)
.disposed(by: bag)
tap.filter { [=11=] == .pin }
.bind(to: viewModel.registerPinPressed)
.disposed(by: bag)
可能有一个更好的解决方案,它根本不涉及 PublishSubjects,但在不知道上下文的情况下,这是我所能做的。