【问题标题】:Subscribing On UITextfield (Control event, Editing changed)订阅 UITextfield(控制事件,编辑更改)
【发布时间】:2018-10-19 14:49:40
【问题描述】:

我想在触发 UIControlEvent Editing Changed 后使用 RxSwift 从 UITextField 中获取文本。

为了做到这一点:

我像这样将故事板的文本字段出口连接到我的视图控制器。

@IBOutlet weak var currentPasswordTextField: UITextField!

然后在这个文本字段的 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)
    }
}

但文本是 Void 而不是字符串..

如果有人可以帮助我不胜感激。 提前致谢。

附:我不想使用 IBActions。

【问题讨论】:

    标签: ios swift uitextfield rx-swift uicontrolevents


    【解决方案1】:

    几点:

    • 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 中的任何内容都可能会引用其他必须存在的对象,并且您可能也希望能够引用其他 observables。

    以输入为中心与以输出为中心是什么意思?

    命令式代码倾向于以输入为中心,当您想知道点击按钮时会发生什么时,您通常可以查看一个地方,即按钮的操作。但是,如果您想了解影响特定标签、活动指示器或任何其他输出的所有内容,则必须查看所有代码。视图控制器中的每个函数都可以将信息推送到输出,其中一些可能是。

    声明性代码倾向于以输出为中心,当您想了解影响标签输出的所有内容或导致活动指示器显示/隐藏的原因时,通常可以在一个地方查看。但是,如果您想了解点击按钮所做的一切,则必须查看所有代码才能弄清楚。 (电子表格就是一个很好的例子,如果你想知道特定单元格的输出是如何定义的,你只需要查看 that 单元格中的公式,但是如果你想知道受特定细胞影响的所有细胞,这很痛苦。)

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

    【讨论】:

      【解决方案2】:

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

      在后台,.text.value 的别名)观察控制事件 [.allEditingEvents, .valueChanged] 并返回值。

      更多细节:

      【讨论】:

      • .rx.text.allEditingEvents 上触发事件的事实正是他可能想要订阅控制事件本身的原因。 :-) 但是你是对的,很少有必要那么严格。
      【解决方案3】:

      UITextField 上的didSet 只会在您替换 UITextField 本身时触发,而不是在您在其上设置文本时触发。

      // Does not trigger didSet :
      self.currentPasswordTextField.text = "text"
      // Does trigger didSet
      self.currentPasswordTextField = UITextField()
      

      【讨论】:

      • 你好 sylvain,正如我在我的问题中提到的,我只想使用 RxSwift 而不使用任何 IBActions。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-29
      • 2016-01-22
      • 2019-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多