swift - 在 RxSwift 中以不同类型绑定文本文件的两种方法
问题描述
我正在为 UITextField 扩展进行两种绑定方式。它适用于字符串。但为什么不是 Int?这是我的扩展:
import Foundation
import RxCocoa
import RxSwift
extension UITextField {
func bind(with property: BehaviorRelay<String?>, bag: DisposeBag = DisposeBag()) {
property.bind(to: self.rx.text).disposed(by: bag)
self.rx.text.bind(to: property).disposed(by: bag)
}
func bind(with property: BehaviorRelay<Int?>, bag: DisposeBag = DisposeBag()) {
property.map { intValue in
return Int.toString(intValue) //convert from Int to String
}.bind(to: self.rx.text).disposed(by: bag)
self.rx.text.orEmpty.map { text in
return String.toInt(text) ?? 0 //convert from String to Int
}.bind(to: property).disposed(by: bag)
}
}
在我的视图模型中:
let fullName = BehaviorRelay<String?>(value: nil)
let phone = BehaviorRelay<Int?>(value: nil)
用法:
textField1.bind(with: viewModel.fullName) //working well
textField2.bind(with: viewModel.phone) //only from viewModel to textField
但是当我直接使用它时,它的工作方式如下:
textField2.rx.text.map { text in
return String.toInt(text) ?? 0
}.bind(to: viewModel.phone).disposed(by: bag)
我错过了什么吗?任何答案都可以接受。谢谢。
解决方案
bag
当我调用该函数时,我错过了通行证。确切地说,应该是:
let bag = DisposeBag()
textField1.bind(with: viewModel.fullName, bag: bag) //working well
textField2.bind(with: viewModel.phone, bag: bag)
我还需要删除默认值以避免将来忘记
func bind(with property: BehaviorRelay<Int?>, bag: DisposeBag) {
property.map { intValue in
return Int.toString(intValue) //convert from Int to String
}.bind(to: self.rx.text).disposed(by: bag)
self.rx.text.orEmpty.map { text in
return String.toInt(text) ?? 0 //convert from String to Int
}.bind(to: property).disposed(by: bag)
}
推荐阅读
- swift - CollectionViewCell 发送上一张图片
- firemonkey - UnicodeString 删除方法(32 位 Win 和 iOS/Android 的结果不同)
- ios - 如何在 DataViewController 的 viewDidLoad 中加载数据,而不减慢 pageViewController 的滚动速度?
- javascript - 使用 ExclusiveStartKey 时的 API Gateway 代理响应
- apache-spark - Spark - 我是否正确读取了 csv?
- node.js - Sqlite3 错误消息显示在 Postgresql 应用程序上
- c# - ListView 项内的按钮绑定 (Xamarin)
- python - 如何用python知道列的值(xlsx)== mylist的元素?
- ios - IOS Stack View Basics
- c# - C# Autocad UserControl WPF 从另一个类更改文本框