2015-12-29 5 views
0

Предположим, у меня есть поток собак private var dogs: Observable<[Dogs]>. Каждый раз, когда генерируется новое значение, мой блок вызывается там, где я создаю новый источник данных и делегирую его для моего UIPickerView, а затем в блоке я вызываю pickerView.reloadAllComponents(), но мое представление появляется с пустым элементом pickerView, даже если запрашивается dataSource и делегат.UIPickerView не отображает данные даже после запроса

Пример кода:

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 и делегат я знаю это опрашиваются и причина, почему я держать DataSource и передать ссылку на UIViewController это связано с тем, что UIPickerView держит слабую ссылку на эти.

Эта одна из последних стратегий, которые я пробовал и по-прежнему получал тот же результат. Любая помощь будет оценена по достоинству. Благодарю.

Update:

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) 
    } 
} 
+0

Не могли бы вы также предоставить реализацию протокола PickerViewDataSource UIPickerViewDataSource? – iyuna

+0

обновлено, спасибо –

+0

Вы отлаживались, если какой-либо из методов UIPickerViewDataSource или UIPickerViewDelegate вызывается после перезагрузки функции AllComponents? – iyuna

ответ

0

Если я вас правильно понимаю, на viewDidLoad вы инициализацию вашего pickerView с новым делегатом и источником данных, вызовом reloadAllComponents и ожидая, что все должно отображаться правильно. Но вы все еще показываете pickerView с предыдущего контроллера представления. Вы должны попытаться скрыть представление сборщика в режиме просмотра ViewDillappear предыдущего вида и отобразить новый в методе viewDidAppear нового контроллера представления.

+0

извините за поздний ответ ... праздничный сезон. Похоже, что я вызываю тот же PickerView, что и при повторном вызове метода viewDidLoad() и имеет новую ссылку (так что я угадываю новый экземпляр pickerView), и новая ссылка передается в новый экземпляр dataSource. К сожалению, надеялся, что так оно и будет. –

+0

Итак, вы уже исправили проблему? – iyuna

+0

Я показал это различным коллегам, которые вернулись из отпуска. Ничто из этого не могло решить, поэтому я отказался от него и попробовал другой подход. Похоже, что unoun segue был обычным классом segue, который сделал эту странную вещь для вызова метода viewDidLoad() снова после размотки. Проблема заключалась в навигации и в том, что взгляды были программно сложены. Спасибо за вашу помощь! –

Смежные вопросы