繁体   English   中英

如何使用 rx swift 阻止我的 UISwitch 切换?

[英]How do I stop my UISwitch from toggling using rx swift?

我有一个连接到rxUISwitch 每当它被切换时, alertView显示一个alertView 如果选择 ok,一些事情会发生,但如果按下取消,什么都不会发生,并且UISwitch将保持在同一位置,即它不会被切换。

mySwitch.rx.controlEvent(.valueChanged).subscribe(onNext: { [weak self] _ in
    guard let self = self else { return }

    CustomAlertViewController.standardTwoButtonMessageAlert(title: self.mySwitch.isOn ? "Do you want to turn this on?" : "Do you want to turn this off?", msg: "hello", action: {           
        print("Doing stuff")
    }, cancelAction: {
        //SHOULD NOT TOGGLE
    })?.present(animated: true, onView: UIApplication.topViewController())
}).disposed(by: disposeBag)

还有一个问题是当我到达cancelActionUISwitch已经被切换了,这意味着它需要再次切换回来。 我如何切换回来? 有没有办法完全防止它切换,以便我可以在闭包内手动管理它?

这个问题描述了两个原因(用户切换开关和用户点击取消按钮)和三个效果(呈现警报、关闭开关和“做事”。)让我们解决每个效果。

我们在拨动开关打开时显示警报...由于我们需要警报按钮发出的值,因此这种效果也会导致其他一些效果。 这意味着我们使用 flatMap 而不是订阅:

let alertResult = settingSwitch.rx.isOn
    .filter { $0 }
    .map { _ in }
    .flatMapFirst { [unowned self] in
        self.present(alert(title: "Hello", message: "Are you sure?"), animated: true)
    }
    .share(replay: 1)

如果用户点击警报上的取消按钮,那么我们需要关闭开关。

alertResult
    .filter { $0 == .cancel }
    .map { _ in false }
    .bind(to: settingSwitch.rx.isOn)
    .disposed(by: disposeBag)

如果用户点击警报上的确定按钮,那么我们需要做一些事情。

alertResult
    .filter { $0 == .ok }
    .map { _ in }
    .subscribe(onNext: {
        doStuff()
    })
    .disposed(by: disposeBag)

这一切都假设您不介意在警报响起时开关处于打开位置。 如果你想阻止这种情况发生,你需要在开关上放一个按钮,让开关只是一个结果,而不是一个原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM