UITextField 的 bindTo rx_text 没有触发 UITextField 的发射事件

bindTo rx_text of a UITextField did not trigger the UITextField's emit event

我是RxSwift的新手。

我修改了 RxSwift Example App 中的 Simple Numbers 示例,它将三个数字添加到一个结果数字中。

我加了一个testStrUITextField和一个upperCaseUILabel。我将 testStr 映射为大写,将 bindTo 映射为 upperCase 标签,这很好。我还将 testStr 映射到它的 lengthbindTo 映射到 num1 字段。奇怪的事情发生了,虽然 num1 字段的内容发生了变化,但它并没有发出任何事件,所以对 result 标签没有影响。即使我在另一个数字字段中输入了一些数字,result 数字也不计入 num1.

我对bindTo有什么错误的使用吗?我可以用什么方式让 num1 发出事件?

谢谢!!!

@IBOutlet weak var num1: UITextField!
@IBOutlet weak var num2: UITextField!
@IBOutlet weak var num3: UITextField!
@IBOutlet weak var result: UILabel!

@IBOutlet weak var testStr: UITextField!
@IBOutlet weak var upperCase: UILabel!

let disposeBag = DisposeBag()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view, typically from a nib.
    Observable.combineLatest(num1.rx_text, num2.rx_text, num3.rx_text) {
        (textval1, textval2, textval3) -> Int in
            return (Int(textval1) ?? 0) + (Int(textval2) ?? 0) + (Int(textval3) ?? 0)
        }
        .map{[=11=].description}
        .bindTo(result.rx_text)
        .addDisposableTo(disposeBag)

    let obStr = testStr.rx_text

    obStr
        .map {[=11=].uppercaseString}
        .bindTo(upperCase.rx_text)
        .addDisposableTo(disposeBag)

    obStr
        .map{ [=11=].characters.count }
        .map{ [=11=].description }
        .bindTo(num1.rx_text)
        .addDisposableTo(disposeBag)
}

您需要使用SubjectVariable来存储值。您可以在 this answer in the section called Using Variables.

中看到这样的示例

它不起作用的原因是因为 rx_text 只会在用户更改时省略下一个元素,不是 以编程方式(就像你正在做的那样) ).这是因为 rx_text 实际上是在使用 UIControl 中的这个方法来获取字段更改的通知:

public class UIControl : UIView {
    public func addTarget(target: AnyObject?, action: Selector, forControlEvents controlEvents: UIControlEvents)
}

但是,当更改以编程方式发生时,该方法不会调用 target 上的 action 方法。 用户 更改某些内容时发生。

因此,如果您要以编程方式更改字段然后用户要进入(或离开)该字段,您应该会看到下一个事件。然而,这不是你想要的。

相反,请参考我链接到的那个答案,它会起作用。