您的位置:首页 > 移动开发 > Swift

07.RxSwift textFiled和textView

2019-08-11 16:44 1546 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_27811473/article/details/99196960

RxSwift textFiled和textView

1.测试代码
override func viewDidLoad() {
super.viewDidLoad()

// 1: textFiled & textView来了
// 2: why 来两次
textFiled.rx.text.subscribe(onNext: { (text) in
print("输入来了 \(text)")
})

textView.rx.text.subscribe(onNext: { (text) in
print("textView:输入来了 \(text)")
})

// event
textFiled.addTarget(self, action: #selector(textFiledChange), for: .allEditingEvents)

}

@objc func textFiledChange() {
print("laile")
}

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
textFiled.text = "LiHua"
//textFiled.sendActions(for: .allEditingEvents)
textView.text = "LiMing"
}
  • 上面的代码会有两个问题:
  1. 当我执行
    textFiled.text = "LiHua"
    textView.text = "LiMing"
    的时候,
    textFiled
    不会打印,
    textView
    会打印
  2. 当我点击输入框的时候会连续打印两次

    一样的代码逻辑,一个走,一个不走
    说明Rx内部两者封装的逻辑不一样
  • 首先看

    textView.text
    ,这里使用的是
    uses text storage notifications
    储存通知

  • 再看

    textFiled.text
    ,这里用的是
    Events
    ,而这里只是个赋值

  • 解决方法:
    只要在赋值的时候设置:

    textFiled.sendActions(for: .allEditingEvents)

  • 那why会走两次呢:

  1. 初始化序列的时候 -> 默认会发送一次
    .onNext
    ,让信号成为热信号(激活)
  2. 点击 ->
    event
    ->
    edit begin


  • 解决方法:加一个
    skip(1)
    即可,防止创建的时候默认调用一次
//加一个skip(1)即可,防止创建的时候默认调用一次
textFiled.rx.text.skip(1). subscribe(onNext: { (text) in
print("输入来了 \(text)")
})

TextFild 内部响应逻辑:

textFiled.addTarget(target, action: #selector(textFiledChange), for: .allEditingEvents)

target
->
ControlTarget
->响应
selector
-->
callBack
闭包

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: