0

私が犬の流れを持っているとしましょう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)
    }
}
4

1 に答える 1