RxSwift: установить начальное значение для UIPickerView

Я пытаюсь установить начальное значение для UIPickerView.

Вот пример моего кода:

@IBOutlet weak var pickerView: UIPickerView!

override func viewDidLoad() {
    super.viewDidLoad()

    Observable.just([1, 2, 3])
        .bind(to: pickerView.rx.itemTitles) { _, item in
            return "\(item)"
        }
        .disposed(by: disposeBag)

    pickerView.rx.modelSelected(Int.self)
        .subscribe(onNext: { models in
            print("models selected 1: \(models)")
        })
        .disposed(by: disposeBag)
}

Я не знаю, как я могу сделать двустороннюю привязку с моей ViewModel или просто установить начальное значение.

Любые идеи приветствуются!


person vermotr    schedule 22.05.2018    source источник


Ответы (3)


На самом деле, использование собственного метода UIPickerView — это нормально;

mPicker.selectRow(defaultRowIndex, inComponent: 0, анимированный: false)

person Halley Wang    schedule 03.08.2018

Основываясь на ответе @halley-wang, я нашел решение в репозитории RxSwift: https://github.com/ReactiveX/RxSwift/blob/master/Tests/RxCocoaTests/UIPickerView%2BRxTests.swift#L169-L170

Итак, вот мой код:

let row = 42 // Default row
pickerView.selectRow(row, inComponent: 0, animated: false)
pickerView.delegate?.pickerView!(pickerView,
                                 didSelectRow: row,
                                 inComponent: 0)
person vermotr    schedule 07.09.2018

Я бы предложил создать переменную в модели представления типа: Variable. В вашем контроллере просмотра сделайте эту переменную наблюдаемой и привяжите к pickerview. Если вы измените значение переменной, оно будет автоматически отражено в окне выбора.

Пример фрагмента кода может быть:

//viewmodel file: --------------
var dataSourceArray: Variable<[String]> = Variable([])
//somewhere after receiving data: add to data source
dataSourceArray.value.append(YOUR_NEW_DATA)

////// viewcontroller file----------------
self.viewModel.dataSourceArray.asObservable().bind(to: pickerView.rx.itemTitles) { _, item in
        return "\(item)"
    }
    .disposed(by: disposeBag)

Пожалуйста, проигнорируйте несколько синтаксиса, если таковые имеются. Дайте мне знать для любой дальнейшей помощи.

person Van    schedule 23.05.2018
comment
Я бы вообще не советовал использовать для этого Variable, так как он устарел. - person Shai Mishali; 29.05.2018
comment
@ShaiMishali, не могли бы вы подсказать, как его можно заменить на BehaviorRelay? Я новичок в RxSwift для этого изменения. Предложения приветствуются :) - person Van; 04.06.2018