BehaviorRelay в tableviewcell - PullRequest
       64

BehaviorRelay в tableviewcell

1 голос
/ 11 июля 2020

Я новичок в RxSwift, поэтому я попытаюсь объяснить свой сценарий ... Я использую UITableView вместе с RxTableViewSectionedReloadDataSource.

В одной из моих ячеек, которая отображает UITextField У меня есть это:

var observer: BehaviorRelay<String?>! {
    didSet {
        observerDisposable = textField.rx.text.bind(to: observer)
    }
}

Теперь всякий раз, когда эта ячейка выбрана, я показываю всплывающее окно (не в ячейке), где пользователь может выбрать дату из UIDatePicker с BehaviorRelay<Date?>. Итак, что я хочу сделать, так это то, что когда пользователь выбирает дату, я хочу обновить эту ячейку текстового поля с выбранной датой.

Как мне сделать это с RxSwift?

1 Ответ

1 голос
/ 12 июля 2020

Во-первых, Observables, Subjects и Relays никогда не должны быть в var, они всегда должны быть let s.

Теперь, чтобы решить вашу проблему ... Я ожидал увидеть код это примерно так:

let dateText = PublishSubject<String>()

let date = tableView.rx.itemSelected
    .filter(isDateTableView)
    .flatMapFirst { [unowned self] (_) -> Driver<Date> in self.getDate() }

date
    .map { dateFormatter.string(from: $0) }
    .bind(to: dateText)
    .disposed(by: disposeBag)

let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Int>>(configureCell: { dataSource, tableView, indexPath, item in
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! ExampleTableViewCell
    if isDateTableView(indexPath) {
        dateText
            .bind(to: cell.textField.rx.text)
            .disposed(by: cell.disposeBag)
    }
    return cell
})

Driver.just([SectionModel<String, Int>(model: "test", items: [12])])
    .drive(tableView.rx.items(dataSource: dataSource))
    .disposed(by: disposeBag)

Весь приведенный выше код (включая определение dateText) будет go в вашем viewDidLoad или функции, которую вызывает viewDidLoad.

...