tableviewcell 中的 BehaviorRelay
BehaviorRelay in tableviewcell
我是 RxSwift 的初学者,所以我会尝试解释我的场景...我正在使用 UITableView
和 RxTableViewSectionedReloadDataSource
。
在我的一个显示 UITextField
的单元格中,我有这个:
var observer: BehaviorRelay<String?>! {
didSet {
observerDisposable = textField.rx.text.bind(to: observer)
}
}
现在,每当该单元格被 selected 时,我都会显示一个弹出视图(不在单元格中),用户可以在其中 select 来自具有 UIDatePicker
的日期15=]。所以我想做的是,当用户 select 是一个日期时,我想用 selected 日期更新该文本字段单元格。
我如何使用 RxSwift 做到这一点?
首先,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: [=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 调用的函数。
我是 RxSwift 的初学者,所以我会尝试解释我的场景...我正在使用 UITableView
和 RxTableViewSectionedReloadDataSource
。
在我的一个显示 UITextField
的单元格中,我有这个:
var observer: BehaviorRelay<String?>! {
didSet {
observerDisposable = textField.rx.text.bind(to: observer)
}
}
现在,每当该单元格被 selected 时,我都会显示一个弹出视图(不在单元格中),用户可以在其中 select 来自具有 UIDatePicker
的日期15=]。所以我想做的是,当用户 select 是一个日期时,我想用 selected 日期更新该文本字段单元格。
我如何使用 RxSwift 做到这一点?
首先,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: [=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 调用的函数。