代码之家  ›  专栏  ›  技术社区  ›  MhmdRizk

订阅UITextfield(控件事件,编辑已更改)

  •  0
  • MhmdRizk  · 技术社区  · 7 年前

    我想在触发uicontrol事件编辑更改后使用RxSwift从UITextField获取文本。

    为此:

    @IBOutlet weak var currentPasswordTextField: UITextField!
    

    然后在这个textfield的didSet属性上我尝试了这个:

    @IBOutlet weak var currentPasswordTextField: UITextField!{
        didSet{
            currentPasswordTextField
                .rx
                .controlEvent(.editingChanged)
                .asObservable()
                .subscribe(onNext: { (text) in
                //I want here to print the text after the editing changed. 
                   print(text)
                })
                .disposed(by: disposeBag)
        }
    }
    

    但是文本不是字符串。。

    如果有人能帮忙,我会很感激的。

    3 回复  |  直到 7 年前
        1
  •  12
  •   Community Mohan Dere    6 年前

    一些要点:

    • asObservable() 是不必要的。
    • .rx.text.orEmpty 但是当文本字段开始和结束编辑时,您将获得事件。

    干得好:

    @IBOutlet weak var currentPasswordTextField: UITextField!{
        didSet{
            currentPasswordTextField
                .rx
                .controlEvent(.editingChanged)
                .withLatestFrom(currentPasswordTextField.rx.text.orEmpty)
                .subscribe(onNext: { (text) in
                    //I want here to print the text after the editing changed.
                    print(text)
                })
                .disposed(by: disposeBag)
        }
    }
    

    昨晚我还想了些别的。。。

    didSet 会有问题的。Rx代码倾向于以输出为中心,而不是以输入为中心。正因为如此,无论发生什么 subscribe 很可能会引用一些其他的对象,也必须存在,你很可能会希望能够引用其他观察到的。

    我说的以输入和输出为中心是什么意思?

    命令式代码倾向于 以输入为中心

    声明性代码倾向于 以输出为中心 ,当您想知道影响标签输出的所有内容,或者是什么导致活动指示器显示/隐藏时,通常只有一个地方可以查看。但是,如果您想了解点击按钮所做的一切,您必须查看所有代码才能找到答案(电子表格就是一个很好的例子,如果您想知道特定单元格的输出是如何定义的,您只需要查看 细胞,但如果你想知道受某个细胞影响的所有细胞,那就麻烦了。)

    根据我的经验,以上是程序员在使用Rx时最难理解的事情。

        2
  •  1
  •   Rax    7 年前

    currentPasswordTextField.rx. text (或 .text.orEmpty 如果您不想要可选的字符串),而不是控件事件本身。

    .text (这是 .value )观察控制事件 [.allEditingEvents, .valueChanged] 并返回值。

        3
  •  0
  •   Sylvain    7 年前

    // Does not trigger didSet :
    self.currentPasswordTextField.text = "text"
    // Does trigger didSet
    self.currentPasswordTextField = UITextField()
    
    推荐文章