Как связать средство выбора из массива в rxswift? - PullRequest
0 голосов
/ 01 ноября 2018

Я хочу связать средство выбора из массива. Массив содержит значения. Но сборщик показывает пустым.

В представленной модели я взял функцию в протоколе func updatedPharmacyList() -> Observable<[String]>

добавить данные в массив. self.newArray.append((pharmacy?.name)!)

массив содержит данные.

func updatedPharmacyList() -> Observable<[String]> {
    return Observable.just(self.newArray)
}

и затем в viewcontroller свяжите средство выбора следующим образом

viewModel.updatedPharmacyList()
  .bind(to: pharmacyPicker.rx.itemTitles) { _, item in
    return item
  }
  .disposed(by: disposeBag)

но сборщик гаснет.

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Rx picker принимает массив массивов как данные, т.е. вам нужно Observable<[[String]]>

0 голосов
/ 02 ноября 2018

Ваш код должен работать, проверьте, работает ли ваша наблюдаемая или нет, используя метод подписки.

viewModel.updatedPharmacyList().subscribe {print($0.element)}

Но если он не работает, вы можете использовать адаптер, даже если вы можете добавлять или изменять разделы сборщика.

let adaptor = RxPickerViewStringAdapter<[String]>( components: [],
                                                       numberOfComponents: { _,_,_  in 2 },
                                                       numberOfRowsInComponent: { (_, _, _, component) -> Int in
                                                        return (component == 0) ? self.model?.arrayForFirst.value.count ?? 0 : self.model?.arrayForSecond.value.count ?? 0 },
                                                       titleForRow: { (_, _, items, row, component) -> String? in
                                                        return (component == 0) ? self.model?.arrayForFirst.value[row] : self.model?.arrayForSecond.value[row]}
    )
model?.arrayForFirst.asObservable()
        .bind(to: self.pickerViewPS.rx.items(adapter: adaptor)).disposed(by: self.bag)

Для этого вам нужно импортировать RxDataSources.

0 голосов
/ 01 ноября 2018

Observable.just(self.newArray) генерирует массив таким, какой он есть в данный момент, а затем генерирует завершенное событие. Добавление чего-либо в массив после этого не будет замечено.

Лучшим решением было бы связать результаты того, что составляет список аптек. «Частично Rx» решение было бы заменить newArray одним из типов субъектов (вероятно, BehaviorRelay и связать его с pharmacyPicker.) Затем, когда вы accept добавили новый массив в реле поведения, он будет уведомить сборщика об изменении.

...