我是学习RxSwift的新手。
我在RxSwift示例应用程序中修改了“简单数字”示例,它将在结果数字中添加三个数字。
我添加了testStr
UITextField
和upperCase
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)
}
最佳答案
您需要使用Subject
等Variable
来存储值。您可以在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
方法。 由于用户更改了某些内容而仅在发生。因此,如果您要以编程方式更改字段,然后用户点击(或退出)该字段,则应该看到下一个事件。但是,这不是您想要的。
相反,请参考我将您链接到的答案,它将起作用。