【问题标题】:Two ways binding textfiled in RxSwift in different typeRxSwift中不同类型的两种方式绑定文本字段
【发布时间】:2021-10-08 07:35:45
【问题描述】:

我正在为 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)

我错过了什么吗? 任何答案都可以接受。谢谢。

【问题讨论】:

  • 对我来说是双向的。您能否描述重现问题的具体步骤,以及究竟发生了什么?
  • 我让 viewModel 从 API 获取数据。就我而言,加载数据后,它会在文本字段中显示值,但是当我更改文本时,viewModel 中的值会保持稳定
  • 但是,当我直接使用它时。它工作。 ``` textField2.rx.text.map { text in return String.toInt(text) ?? 0 }.bind(to: viewModel.phone).disposed(by: bag)```

标签: swift binding reactive-programming rx-swift rx-cocoa


【解决方案1】:

当我调用该函数时,我错过了传递 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)
    }

【讨论】:

    猜你喜欢
    • 2017-09-05
    • 2016-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 2017-05-05
    相关资源
    最近更新 更多