tableviewcell 中的 BehaviorRelay

BehaviorRelay in tableviewcell

我是 RxSwift 的初学者,所以我会尝试解释我的场景...我正在使用 UITableViewRxTableViewSectionedReloadDataSource

在我的一个显示 UITextField 的单元格中,我有这个:

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

现在,每当该单元格被 selected 时,我都会显示一个弹出视图(不在单元格中),用户可以在其中 select 来自具有 UIDatePicker 的日期15=]。所以我想做的是,当用户 select 是一个日期时,我想用 selected 日期更新该文本字段单元格。

我如何使用 RxSwift 做到这一点?

首先,Observables、Subjects 和 Relays 永远不应该在 var 中,它们应该总是 lets。

现在来解决你的问题......我希望看到这样的代码:

let dateText = PublishSubject<String>()

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

date
    .map { dateFormatter.string(from: [=10=]) }
    .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 的定义)都将进入您的 viewDidLoad 或 viewDidLoad 调用的函数。