RxSwift привязать к форматированному значению переменной - PullRequest
0 голосов
/ 19 января 2019

Только начал изучать 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 голосов
/ 19 января 2019

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)
0 голосов
/ 19 января 2019

Сначала вы должны сопоставить свою переменную, а затем привязать ее к кнопке

В 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.

Проверьте этот репозиторий , он показывает, как правильно использовать RxSwift:

...