RxSwift:为 UIPickerView 设置初始值

RxSwift: Set initial value for 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 进行双向绑定或只设置初始值。

欢迎提出任何想法!

我建议在视图模型中创建一个类型为变量的变量。在您的 viewcontroller 中使该变量可观察并绑定到 pickerview。如果您更改变量的值,它将自动反映在 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)

请忽略一些语法(如果有的话)。如需进一步帮助,请告诉我。

其实用UIPickerView自带的方法就可以了;

mPicker.selectRow(defaultRowIndex, inComponent: 0, animated: false)

根据@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)