如何使用 RXSwift 将 Object 的属性绑定到 UIlabel?

Posted

技术标签:

【中文标题】如何使用 RXSwift 将 Object 的属性绑定到 UIlabel?【英文标题】:How to bind Object's property to an UIlabel using RXSwift? 【发布时间】:2019-10-04 06:31:30 【问题描述】:

我有一个模型类,如下所示:

class Model
    var currentTemparature:String?
    var minTemparature:String?
    var maxTemparature:String?

    init(currentTemparature:String,minTemparature:String,maxTemparature:String) 
        self.currentTemparature = currentTemparature
        self.maxTemparature = maxTemparature
        self.minTemparature = minTemparature
    

我想使用 RXSwift 将这些属性中的每一个绑定到 ViewController 中的 UILabel。

例如:

class ViewController:UIViewController
    @IBOutlet var currentTemparatureLabel: UILabel!
    @IBOutlet var minTemparatureLabel: UILabel!
    @IBOutlet var maxTemparatureLabel: UILabel!

    func UpdateLabels()
        let model = Model.init(currentTemparature: "25", minTemparature: "20", maxTemparature: "30")
        currentTemparatureLabel.text = model.currentTemparature
        minTemparatureLabel.text = model.minTemparature
        maxTemparatureLabel.text = model.maxTemparature
    

当模型属性的值发生变化时,我想更新标签。我怎样才能做到这一点?

【问题讨论】:

你已经研究/尝试了什么? 我尝试使用 BehaviorRelay 将单个字符串变量绑定到标签。 什么会导致值改变? 【参考方案1】:

您应该有一个数据模型的 Observable(例如可能从服务器获取),然后,您可以使用 .bind(yourlabel.rx.text) 直接将其结果绑定到您的标签

每次值发生变化时,它也会通过绑定到您的标签来更新您的视图

【讨论】:

【参考方案2】:

尝试使用 BehaviorRelay

别忘了导入 RxSwiftRxCocoa

class Model
    var currentTemparature: BehaviorRelay<String?>
    var minTemparature: BehaviorRelay<String?>
    var maxTemparature: BehaviorRelay<String?>

    init(currentTemparature:String,minTemparature:String,maxTemparature:String) 
        self.currentTemparature = .init(value: currentTemparature)
        self.maxTemparature = .init(value: maxTemparature)
        self.minTemparature = .init(value: minTemparature)
    

class ViewController:UIViewController
    @IBOutlet var currentTemparatureLabel: UILabel!
    @IBOutlet var minTemparatureLabel: UILabel!
    @IBOutlet var maxTemparatureLabel: UILabel!

    private var bag = DisposeBag()

    func UpdateLabels()
        let model = Model.init(currentTemparature: "25", minTemparature: "20", maxTemparature: "30")
        
        model.currentTemparature.bind(to: currentTemparatureLabel.rx.text).disposed(by: bag)
        model.minTemparature.bind(to: minTemparatureLabel.rx.text).disposed(by: bag)
        model.maxTemparature.bind(to: maxTemparatureLabel.rx.text).disposed(by: bag)

    

【讨论】:

以上是关于如何使用 RXSwift 将 Object 的属性绑定到 UIlabel?的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift - 类属性的绑定

如何使用 RxSwift 观察 Bool 属性?

如何使用 RxSwift 处理应用程序状态

如何使用 RxSwift 观察 UITextField 中的文本变化?

如何读取 RxSwift 属性的值? <驱动程序>布尔

如何在 RxSwift 中观察对象的属性?