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 示例,它将三个数字添加到一个结果数字中。
我加了一个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{[=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)
}
您需要使用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)
}
但是,当更改以编程方式发生时,该方法不会调用 target
上的 action
方法。 仅 当 用户 更改某些内容时发生。
因此,如果您要以编程方式更改字段然后用户要进入(或离开)该字段,您应该会看到下一个事件。然而,这不是你想要的。
相反,请参考我链接到的那个答案,它会起作用。
我是RxSwift的新手。
我修改了 RxSwift Example App 中的 Simple Numbers 示例,它将三个数字添加到一个结果数字中。
我加了一个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{[=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)
}
您需要使用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)
}
但是,当更改以编程方式发生时,该方法不会调用 target
上的 action
方法。 仅 当 用户 更改某些内容时发生。
因此,如果您要以编程方式更改字段然后用户要进入(或离开)该字段,您应该会看到下一个事件。然而,这不是你想要的。
相反,请参考我链接到的那个答案,它会起作用。