在 MVVM 上编写项目,并尝试将所有内容与 RxSwift 绑定。 不幸的是,我没有找到适当的方法来绑定动作。
例如,我有一张桌子和一个带有一个按钮的简单单元格-“选择”。
为此,我将有两个视图模型:'yes'
和ListViewModel
CellViewModel
将创建ListViewModel
的数组,需要订阅选择事件(自定义事件)。
现在,我正在为此目的使用BehaviorSubject,但是它看起来很丑。谁能指出我需要如何使用 RxSwift ?
CellViewModel
答案 0 :(得分:0)
您需要在某个地方放置一个主题,因为在创建事件的使用者时,事件的发射器不存在。通常我在视图控制器中放置一个主题,而不是在每个单元格中放置一个主题。像这样:
class Cell: UITableViewCell {
@IBOutlet private var selectionButton: UIButton!
private var disposeBag = DisposeBag()
override func prepareForReuse() {
super.prepareForReuse()
disposeBag = DisposeBag()
}
func configure(with makeViewModel: (Observable<Void>, DisposeBag) -> Void) {
makeViewModel(selectionButton.rx.tap.asObservable(), disposeBag)
}
}
视图控制器将类似于:
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
let disposeBag = DisposeBag()
var makeViewModel: (Observable<CellID>) -> Observable<[CellID]> = { _ in fatalError() }
override func viewDidLoad() {
super.viewDidLoad()
let cellSelection = PublishSubject<CellID>()
let cells = makeViewModel(cellSelection)
cells
.bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: Cell.self)) { index, element, cell in
cell.configure(with: { selected, disposeBag in
selected
.map { element }
.bind(to: cellSelection)
.disposed(by: disposeBag)
})
return
}
.disposed(by: disposeBag)
}
}