如何使用Rxswift订阅UISwitch的值更改控制事件

7rfyedvj  于 12个月前  发布在  Swift
关注(0)|答案(5)|浏览(105)

我想使用Rxswift而不是IBActions来解决下面的问题,
我有一个UISwitch,我想订阅其中的value changed事件,
我通常用这种方式订阅电子邮件

@IBOutlet weak var myButton: UIButton!

myButton
    .rx
    .tapGesture()
    .when(.recognized)
    .subscribe(onNext : {_ in /*do action here */})

字符串
有人知道如何订阅UISwitch控件事件吗?

v8wbuo2f

v8wbuo2f1#

我找到了我要找的答案,为了订阅和控制事件,我们应该做以下事情:

@IBOutlet weak var mySwitch : UISwitch!

       mySwitch 
            .rx
            .controlEvent(.valueChanged)
            .withLatestFrom(mySwitch.rx.value)
            .subscribe(onNext : { bool in
                // this is the value of mySwitch
            })
            .disposed(by: disposeBag)

字符串

hc8w905p

hc8w905p2#

Below are some caveats you would use for UISwitch:

 1. Make sure the event subscribes to unique changes so use distinctUntilChanged
 2. Rigorous switching the switch can cause unexpected behavior so use debounce.

 Example: 

anySwitch.rx
.isOn.changed //when state changed
.debounce(0.8, scheduler: MainScheduler.instance) //handle rigorous user switching
.distinctUntilChanged().asObservable() //take signal if state is different than before. This is optional depends on your use case
.subscribe(onNext:{[weak self] value in
            //your code
}).disposed(by: disposeBag)

字符串

of1yzvn4

of1yzvn43#

有几种方法可以做到这一点,但这是我通常的做法:试试这个。

self.mySwitch.rx.isOn.subscribe { isOn in
            print(isOn)
        }.disposed(by: self.disposeBag)

字符串
我希望这能帮上忙。

编辑:

另一种方法是订阅UISwitchvalue属性,如下所示:

mySwitch.rx.value.subscribe { (isOn) in
            print(isOn)
        }.disposed(by: self.disposeBag)


至于你的评论:
这对我很有用,谢谢,但我更喜欢订阅控制事件本身,而不是值。
我们可以在下面这样做,我不确定是否有比这更好的方法。因为UISwitchUIControl对象,所以你可以订阅它的.valueChanged事件,如下所示:

mySwitch.rx.controlEvent([.valueChanged]).subscribe { _ in
        print("isOn? : \(mySwitch.isOn)")
        }.disposed(by: self.disposeBag)


更多信息:https://developer.apple.com/documentation/uikit/uiswitch

vql8enpb

vql8enpb4#

下面的代码是基于prex的答案编写的。请随时纠正或提出任何改进建议。
RxSwift/RxCocoa 4.4,iOS 12,Xcode 10

private let _disposeBag = DisposeBag()

let viewModel: ViewModel ...
let switchControl: UIControl ...

let observable = switchControl
    .rx.isOn
    .changed   // We want user-initiated changes only.
    .distinctUntilChanged()
    .share(replay: 1, scope: .forever)

observable
    .subscribe(onNext: { [weak self] value in
        self?.viewModel.setSomeOption(value)
    })
    .disposed(by: _disposeBag)

字符串
在这个例子中,当用户(并且只有用户)更改UISwitch的状态时,我们会得到通知。然后我们更新viewModel
反过来,viewModel的任何观察者都会被告知状态的变化,允许他们更新UI等。
例如

class ViewModel
{
    private var _someOption = BehaviorRelay(value: false)

    func setSomeOption(_ value: Bool) { _someOption.accept(value) }

    /// Creates and returns an Observable on the main thread.

    func observeSomeOption() -> Observable<Bool>
    {
        return _someOption
            .asObservable()
            .observeOn(MainScheduler())
    }
}


...

// In viewDidLoad()

    self.viewModel
        .observeSomeOption()
        .subscribe(onNext: { [weak self] value in
            self?.switchControl.isOn = value
            // could show/hide other UI here.
        })
        .disposed(by: _disposeBag)


请参阅:https://stackoverflow.com/a/53479618/1452758

imzjd6km

imzjd6km5#

我放弃了上面的答案,只有最简单的一个在下面工作:

@IBAction func toggleSwitch(_ sender: UISwitch) {
    if(mySwitch.isOn) {
        //Do something
    } else {
        //Do something
    }
}

字符串

相关问题