【问题标题】:UIButton action(rx.tap) responds to different PublishSubjects with RxSwiftUIButton action(rx.tap) 使用 RxSwift 响应不同的 PublishSubjects
【发布时间】:2019-01-26 18:02:22
【问题描述】:

我想为 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)

【问题讨论】:

  • 触发主题的标准是什么?
  • @DanielT。如果第一个请求已通过,我希望为同一个按钮绑定另一个操作。
  • 您在第一次点击后禁用该按钮。不会有第二个...
  • @DanielT。 thanx,但我需要绑定另一个动作并删除第一个动作,而不是禁用。
  • 好的,因为你不应该像这样改变map 中的状态。它导致了一个令人心痛的世界。

标签: ios iphone data-binding uibutton rx-swift


【解决方案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,但在不知道上下文的情况下,这是我能做到的。

【讨论】:

  • 看起来很有希望,但我需要在正确处理第一个动作后进行切换,如果我没记错的话,这似乎在第一次点击后立即切换。
  • 开关是在第一次点击,但它切换注册在第一遍按下,所以是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-14
  • 2016-08-28
  • 1970-01-01
  • 2021-03-25
  • 2017-07-08
相关资源
最近更新 更多