RxSwift绑定到变量的格式化值

时间:2019-01-19 15:50:42

标签: ios swift viewmodel rx-swift

刚刚开始学习RxSwift。我觉得应该有更好的方法来做到这一点:

ViewController:

viewModel.orderDate.asObservable()
        .bind { [weak self] (date) in
            self?.orderButton.setTitle(viewModel.formattedOrderButtonText, for: UIControl.State.normal)
        }
        .disposed(by: disposeBag)

ViewModel:

var orderDate = Variable<Date?>(nil)
var formattedOrderButtonText: String {
    get
    {
        let date = orderDate.value
        if(date == nil)
        {
            return "String 1"
        }
        else
        {
            return "String 2"
        }
    }
}

有什么办法可以将按钮的标题绑定到格式化的变量上?

2 个答案:

答案 0 :(得分:1)

Variable已过时,并且可能在将来的版本中删除,因此我用Relay代替了它。

更好的方法是在map中设置可观察序列的格式并绑定到输出。

ViewModel中这样的事情:

var orderDate = BehaviorRelay<Date?>(value: nil)
lazy var formattedOrderButtonText = orderDate.map { return $0 == nil ? "String 1" : "String 2" }

然后在视图控制器中使用formattedOrderButtonText进行如下绑定:

viewModel.formattedOrderButtonText.bind(to: orderButton.rx.title).disposed(by: disposeBag)

答案 1 :(得分:0)

首先,您必须映射变量,然后将其绑定到按钮

在viewModel中:

let dateTitle: Observable<String> = orderDate.map { date -> String in 
                 return date == nil ? "String 1" : return "String 2"
            }

在视图中:

viewModel.dateTitle.bind(to: orderButton.rx.title).disposed(by: disposeBag)

另外,请检查以Date替换为BehaviourSubject或PublishSubject(但我确定您可以在不将任何数据存储在ViewModel中的情况下进行操作)。我的意思是,如果将日期存储在ViewModel中,则将失去RxSwift的大部分功能。

选中此repository,它显示了如何以正确的方式使用RxSwift: