刚刚开始学习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"
}
}
}
有什么办法可以将按钮的标题绑定到格式化的变量上?
答案 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: