今天继续讲解RxSwift的使用。

主要讲解UISwitch、UISegmentedControl、UISlider、UIStepper以及手势UIGestureRecognizer


1、UISwitch

UISwitch也是一个比较常用的控件,它主要就一个功能,开启关闭,所以他的RxSwift使用也是比较简单的,它的使用方式和UIButton不同,UISwitch不是点击事件,而是开启和关闭,所以它的执行事件不是tap而是isOn。下面附上使用代码

//Switch的点击事件,对点击事件进行订阅,在闭包内就可以收到UISwitch的开关状态
switchs.rx.isOn.subscribe(onNext: { (flag) in
     print("switch -> \(flag)")
     }).disposed(by: disposeBag)

是不是很简单,通过这个我们可以对UISwitch点击事件进一步扩展,例如:我们可以将UISwicth的开启关闭事件绑定到UIButton上,代码如下

//将switch的点击绑定到button上,将Switch的开启关闭绑定到UIbutton的isEnabled上
//当UISwitch开启的时候,UIButton可以点击,反之不能
switchs.rx.isOn.bind(to: button.rx.isEnabled).disposed(by: disposeBag)

2、UISegmentedControl 

UISegmentedControl在开发中使用不是很多,它可以理解为一个按钮数组,这些UIButton构成了UISegmentedControl,其实UISegmentedControl使用和UISwitch一样,都比较简单。下面附上代码。

首先是点击事件

//点击事件
segmentedControl.rx.selectedSegmentIndex.subscribe(onNext: { ( selectIndex ) in
     print("点击了第\(selectIndex)个按钮")
     }).disposed(by: disposeBag)

还有就是扩展了,和UISwicth一样可以进行绑定,代码如下

// 创建一个当前需要显示的图片的可观察序列。
/*
  segmentedControl.rx.selectedSegmentIndex.asObservable(),是将点击事件作为一个观察者。
  map是一个由参数、有返回值的闭包,参数就是$0为点击的第几个按钮,而返回值就是点击第几个按钮对应的图  片,
  imageObserver.bind就是将观序列拿到的UIImage绑定到ImageView上,这样当我们点击按钮的时候,就会展示不同的图片
*/
let imageObserver: Observable<UIImage> = segmentedControl.rx.selectedSegmentIndex.asObservable().map({
    let images = ["img_operation_failure", "img_operation_success"]
    return UIImage(named: images[$0])!
    })
imageObserver.bind(to: imageViews.rx.image).disposed(by: disposeBag)

swiftui 按钮执行shell swift按键_控件

swiftui 按钮执行shell swift按键_sed_02


3、UISlider

UISlider就很简单了,就是一个滑条的功能,主要就是监听滑动事件,代码如下

首先滑动事件

slider.rx.value.subscribe(onNext: { ( value ) in
      print("滑块当前值为:\(value)")
      }).disposed(by: disposeBag)

UISlider也可以将值绑定到其他的控件上,例如UILabel

slider.rx.value.map { 
    "\($0)" 
}.bind(to: label.rx.text).disposed(by: disposeBag)

4、UIStepper 

UIStepper开发中我们基本是不会使用到的,他的使用也非常的简单,一个+、一个-,也就是监听值的变化

stepper.rx.value.subscribe(onNext: { ( value ) in
     print("当前值:\(value)")
     }).disposed(by: disposeBag)

它也可以进行绑定,例如:将结果绑定到UILabel上

stepper.rx.value.map {
      "\($0)"
      }.bind(to: label.rx.text).disposed(by: disposeBag)

5、手势UIGestureRecognizer

GestureRecognizer在开发过程中使用的比较多的,这里我们主要以点击、长按和拖拽三个为例,如果使用到了其他的手势,使用方式也是一样的,手势获取操作内容就不是tap、long这些方式了,为了方便展示,我写了一个弹框,下面点击、长按、拖拽都会将结果展示到弹框上。

@IBOutlet var swipe: UISwipeGestureRecognizer!
    @IBOutlet var tap: UITapGestureRecognizer!
    @IBOutlet var long: UILongPressGestureRecognizer!
//显示消息提示框
    func showAlert(title: String, message: String) {
        let alert = UIAlertController(title: title, message: message,
                                      preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .cancel))
        self.present(alert, animated: true)
    }

首先 UITapGestureRecognizer

tap.rx.event.subscribe(onNext: {  [weak self] recognizer in
    let point = recognizer.location(in: recognizer.view)
    self!.showAlert(title: "点击了", message: "\(point.x),\(point.y)")
    }).disposed(by: disposeBag)

其次 UILongPressGestureRecognizer

long.rx.event.subscribe(onNext: {  [weak self] recognizer in
    let point = recognizer.location(in: recognizer.view)
    self!.showAlert(title: "长按了", message: "\(point.x),\(point.y)")
    }).disposed(by: disposeBag)

最后 UISwipeGestureRecognizer

swipe.rx.event.subscribe(onNext: { [weak self] recognizer in
      let point = recognizer.location(in: recognizer.view)
      self!.showAlert(title: "向右滑动", message: "\(point.x),\(point.y)")
      }).disposed(by: disposeBag)

到此就完成了,这些控件的基本使用。

在开发过程中我们最常使用控件还有UITableView、UICollectionView,这些复杂控件都会涉及到网络请求数据,所以这些控件,在后面我都会以真实的数据进行展示,这样大家可以更好的了解和学习。

下面是本人学习过程自己写的一个demo,感兴趣的小伙伴大家可以下载看一看。


Gitbub下载


RxSwift学习(四)