一起养成写作习惯!这是我参与「日新计划 4 月更文挑战」的第22天,点击查看活动详情。

  • 本文主要介绍下一些常用的UI控件和交互应用说明

1. 常用的UI控件

1.1 button

self.button.rx.tap
      .subscribe(onNext: { () in
       print("点击来了")
      })
      .disposed(by: disposeBag)

对于button默认就是tap,当然我们也可以使用controlEvent来制定我们想要点击事件

self.button.rx.controlEvent(.touchUpOutside)
      .subscribe(onNext: { () in
       print("点击来了")
      }) .disposed(by: disposeBag)

也可以我们手动创建

Observable<String>.of("sss")
      .bind(to: self.button.rx.title())
      .disposed(by: disposeBag)

RxSwift学习-19-RxSwift中常用的UI拓展

对于我们的button的标题,图片,背景和富文本标题都做了拓展

RxSwift学习-19-RxSwift中常用的UI拓展
绑定我们button标题

self.textFiled.rx.text
      .bind(to: self.button.rx.title(for: .normal))
      .disposed(by: disposeBag)

对我们的系统设置值的方法进行了包装,转换为Binder<T?>类型。

RxSwift学习-19-RxSwift中常用的UI拓展

Binder相当于我们的观察http://192.168.1.1登录,序列发生改变会调denotative用他的odenon方法,这里对于binder有个特点事件回调发生在我们主队列中,不会发送完成事件,会一直进行监听
比如我HTTPS们监听的序列发生了改变则进行调用我httpwatch们外面设置的闭http://192.168.1.1登录

RxSwift学习-19-RxSwift中常用的UI拓展

从而更新了我们的百度输入框UI,对于setImagesetBackgroundImageattribudenotativetedTitle都是类似。

1httpclient.2 TextField

textField比较常用,比如监听我们的输入框的值

self.textFiled.rx.text.orEmpty
      .subscribe(onNext: { (text) in
       print(text)
      })
      .disposed(by: disposeBag)

这里使用.orEmpty表示可以为空,nil输入框变小了怎么恢复时候显示为“”

RxSwift学习-19-RxSwift中常用的UI拓展

输入框实时显示到我们的展示框,做到联动

self.textFiled.rx.text
      .bind(to: self.button.rx.title())
      .disposed(by: disposeBag)
   
    self.textFiled.rx.text.orEmpty
      .bind(to: self.label.rx.text)
      .disposed(by: disposeBag)

当然我们可以用做一些条件的判httpclient断,比如我们常用的登陆输入框位数判断,是否按钮可以点击

    let usernameVaild = self.textFiled.rx.text.orEmpty
      .map { (text) -> Bool in
        return text.count >= 6
    }
    usernameVaild.bind(to: self.button.rx.isEnabled)
      .disposed(by: disposeBag)

这里记录下有的时候我们主动赋值,但是确却无js输入框法响应rx的订阅

self.textFiled.rx.text.orEmpty
      .subscribe(onNext: { (text) in
       print(text)
      })
      .disposed(by: disposeBag)
  
    self.textFiled.text = "hello"

没有订阅,我们看下关于textfiled是如何订阅

RxSwift学习-19-RxSwift中常用的UI拓展

看下监听的事件

RxSwift学习-19-RxSwift中常用的UI拓展

监听的textfield的allEditingEventsvalueChanged的事件,我们主动赋值没有触发的。

self.textFiled.text = "hello"
self.textFiled.sendActions(for: .allEditingEvents)

RxSwift学习-19-RxSwift中常用的UI拓展

1.3 scrollerView

scrollView的偏移量,进行deno监听

scrollView.rx.contentOffset
      .subscribe(onNext: { [weak self](content) in
        self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)
      })
    .disposed(by: disposeBag)

1.4 展示类

上面通常会和我们进行交互,对于一些展示类的UI,比如denon是什么品牌我们的label,https和http的区别UIImageVi手势舞ew通常都是观察者类型

self.label.rx.text.onNext("hello")
    let imageV = UIImageView()
    imageV.rx.image.onNext(nil)

RxSwift学习-19-RxSwift中常用的UI拓展

2. 应用

对于我们日常一些开发https和http的区别比如通知,定时器也是手势密码图案大全进行了封装,方便我们使用

2.1 通知

通知的话我们使用rx更简单,比如我们监听键盘的消失的通知

NotificationCenter.default.rx.notification(UIResponder.keyboardWillHideNotification)
      .subscribe(onNext: { (noti) in
        print(noti)
      })
    .disposed(by: disposeBag)

2.2 定时器

定时器

timer = Observable<Int>.interval(DispatchTimeInterval.seconds(1), scheduler: MainScheduler.instance)
    timer.subscribe(onNext: { (num) in
      print(num)
    })
    .disposed(by: disposeBag)

我们可以直接使用http://www.baidu.comtimer

Observable<Int>.timer(DispatchTimeInterval.seconds(0), period: DispatchTimeInterval.seconds(1), scheduler: MainScheduler.instance)
      .subscribe(onNext: {print($0)})
      .disposed(by: disposeBag)

2.3 手势

对于一些手势的监听event事件

let tap = UITapGestureRecognizer()
    self.label.addGestureRecognizer(tap)
    self.label.isUserInteractionEnabled = true
    tap.rx.event.subscribe(onNext: { (tap) in
      print(tap.view as Any)
    })
    .disposed(by: disposeBag)

2.4 网络请求

网络请求response

let url = URL(string: "https://www.baidu.com")
   URLSession.shared.rx.response(request: URLRequest(url: url!))
    .subscribe(onNext: { (response,data) in
      print(response)
    }).disposed(by: disposeBag)

2.5https和http的区别 kvo

kvo之前也有分析过

self.person.rx.observeWeakly(String.self, "name")
      .subscribe(onNext: { (value) in
        print(value as Any)
      })
      .disposed(by: disposeBag)
    self.person.rx.observeWeakly(String.self, "name")
      .subscribe { (name) in
        print(name)
      }
      .disposed(by: disposeBag)

3. 总结

我们日常的使用交互类的空间通常会生成一个序列,因为它是一直变化的比如textField,button等发生改变产生信号,我们展示类的通常是观察者类型,用于赋值。她通过发送事件,调用闭包赋值。这样我们可以通过bind关联他们。对于一些没说到的U手势识别I通常也是差不多的,后面会单独说下tableView