今天继续讲解RxSwift的使用。
主要讲解UISwitch、UISegmentedControl、UISlider、UIStepper以及手势UIGestureRecognizer
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)
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 = 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)
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)
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)
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,感兴趣的小伙伴大家可以下载看一看。
Csdn下载
Gitbub下载
RxSwift学习(四)