0

假设我有一群狗private var dogs: Observable<[Dogs]>。每次生成一个新值时,都会调用我的块,在其中为我创建一个新的数据源和委托UIPickerView,然后在我调用的块中,pickerView.reloadAllComponents()但我的视图显示为一个空的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)

调试数据源和委托我知道这些是被查询的,我在 UIViewController 中保留数据源和委托引用的原因是因为它们UIPickerView持有这些的弱引用。

这是我尝试过的最后一种策略,但仍然得到相同的结果。任何帮助,将不胜感激。谢谢。

更新:

DogPickerView 数据源:

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

0

如果我理解正确,在 viewDidLoad 上,您正在使用新的委托和数据源初始化您的 pickerView,调用 reloadAllComponents 并期望所有内容都应该正确显示。但是您仍然从以前的视图控制器显示pickerView。您应该尝试在前一个视图控制器的 viewWillDisappear 方法上隐藏选择器视图,并在新视图控制器的 viewDidAppear 方法中显示新的。

于 2015-12-30T10:58:49.163 回答