私が犬の流れを持っているとしましょうprivate var dogs: Observable<[Dogs]>
。新しい値が生成されるたびに、新しい dataSource とデリゲートを作成するブロックが呼び出され、UIPickerView
ブロック内で呼び出しますpickerView.reloadAllComponents()
が、dataSource とデリゲートがクエリされても、ビューは空の pickerView で表示されます。
コード例:
self.dataStream
.subscribeNext {
self.dataSource = PickerViewDataSource(data: $0)
self.pickerView.dataSource = self.dataSource
self.delegate = PickerViewDelegate(data: $0, selectedRow: self._selectedRowStream)
self.pickerView.delegate = self.delegate
self.pickerView.reloadAllComponents()
}.addDisposableTo(self.disposeBag)
dataSource とデリゲートのデバッグ これらが照会されることはわかっていますが、UIViewController で dataSource とデリゲート参照を保持している理由は、UIPickerView
これらの弱い参照が保持されているためです。
これは私が試した最後の戦略の 1 つですが、それでも同じ結果が得られます。どんな助けでも大歓迎です。ありがとう。
アップデート:
DogPickerViewDataSource:
class DogPickerViewDataSource: NSObject, UIPickerViewDataSource {
private var dogs: [Dog]
init(
dogs: [Dog]
) {
self.dogs = dogs
}
func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
return 1
}
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return dogs.count
}
}
DogPickerViewDelegate:
class DogPickerViewDelegate: NSObject, UIPickerViewDelegate {
private var selectedRow: BehaviorSubject<Int>
private var dogs: [Dog]
init(
dogs: [Dog],
selectedRow: BehaviorSubject<Int>
) {
self.dogs = dogs
self.selectedRow = selectedRow
}
func pickerView(pickerView: UIPickerView, attributedTitleForRow row: Int, forComponent component: Int) -> NSAttributedString? {
let dogName = (self.dogs[row].name)!
return NSAttributedString(string: dogName)
}
func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
self.selectedRow.onNext(row)
}
}