RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新

Posted

技术标签:

【中文标题】RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新【英文标题】:RxSwift - UILabel field not being updated when UITextField updated programmatically 【发布时间】:2015-11-19 22:18:03 【问题描述】:

我刚刚学习 RxSwift 并且有一个简单的示例,我不确定它为什么不起作用。我有一个文本字段和一个标签字段。每当文本字段更改时,我都希望更新标签字段。如果我在文本字段中输入,一切都会按预期进行。如果我以编程方式设置文本字段,例如当我按下按钮并显式设置文本字段时,标签字段不会更新。

import UIKit
import RxSwift
import RxCocoa

class ViewController: UIViewController 
  @IBOutlet weak var myTextField: UITextField!
  @IBOutlet weak var myLabel: UILabel!

  override func viewDidLoad() 
    super.viewDidLoad()
    myTextField.rx_text.bindTo(myLabel.rx_text)
  

  @IBAction func pBtn(sender: UIButton) 
    myTextField.text = "45"
  

如何让标签字段更新?我查看了很多示例,但似乎找不到一个可以回答这个问题的示例。

【问题讨论】:

【参考方案1】:

将您的代码更改为:

@IBAction func pBtn(sender: UIButton) 
  myTextField.text = "45"
  myTextField.sendActionsForControlEvents(.ValueChanged)

由于文本是一种属性,因此没有一种机制可以知道何时以编程方式更改它。相反,RxCocoa 使用控制事件来知道值何时发生了变化。看看 UIControl+RxSwift.swift 你会发现这样的:

let controlTarget = ControlTarget(control: control, controlEvents: [.EditingChanged, .ValueChanged]) 
  control in
    observer.on(.Next(getter()))

【讨论】:

以上是关于RxSwift - 当 UITextField 以编程方式更新时,UILabel 字段未更新的主要内容,如果未能解决你的问题,请参考以下文章

UITextField 使用 RxSwift 绑定到 ViewModel

如何使用 RxSwift 观察 UITextField 中的文本变化?

根据 UITextField 中的值禁用按钮只能工作一次(RxSwift)

RxSwift 错误:属性“文本”要求“UITextField”继承自“UILabel”

使用 RxSwift 将多个 UITextField 绑定到类道具

swift UITextField与RxSwift