我是学习RxSwift的新手。

我在RxSwift示例应用程序中修改了“简单数字”示例,它将在结果数字中添加三个数字。

我添加了testStr UITextFieldupperCase UILabel。我将testStr映射为大写字母,然后将bindTo映射为upperCase标签,这很好。并且我还将testStr映射到它的length,并且bindTo映射到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{$0.description}
        .bindTo(result.rx_text)
        .addDisposableTo(disposeBag)

    let obStr = testStr.rx_text

    obStr
        .map {$0.uppercaseString}
        .bindTo(upperCase.rx_text)
        .addDisposableTo(disposeBag)

    obStr
        .map{ $0.characters.count }
        .map{ $0.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)
}

但是,当以编程方式进行更改时,该方法不会在action上调用target方法。 由于用户更改了某些内容而仅在发生。

因此,如果您要以编程方式更改字段,然后用户点击(或退出)该字段,则应该看到下一个事件。但是,这不是您想要的。

相反,请参考我将您链接到的答案,它将起作用。

07-28 02:15