![](/img/trans.png)
[英]How do i change the value of a UISwitch from a different class in swift Xcode?
[英]How do I stop my UISwitch from toggling using rx swift?
我有一个连接到rx
的UISwitch
。 每当它被切换时, 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)
还有一个问题是当我到达cancelAction
时UISwitch
已经被切换了,这意味着它需要再次切换回来。 我如何切换回来? 有没有办法完全防止它切换,以便我可以在闭包内手动管理它?
这个问题描述了两个原因(用户切换开关和用户点击取消按钮)和三个效果(呈现警报、关闭开关和“做事”。)让我们解决每个效果。
我们在拨动开关打开时显示警报...由于我们需要警报按钮发出的值,因此这种效果也会导致其他一些效果。 这意味着我们使用 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.