RxSwift(11)双向绑定
2019-08-13 本文已影响0人
忆痕无殇
1:一组tableView的绑定
dataOB.asObserver().bind(to: self.tableView.rx.items(cellIdentifier: resuseID, cellType: LGTableViewCell.self)){
(row,model,cell) in
cell.setUIData(model as! LGModel)
}.disposed(by: self.disposeBag)
点击事件
// tableView点击事件
tableView.rx.itemSelected.subscribe(onNext: { [weak self](indexPath) in
print("点击\(indexPath)行")
self?.navigationController?.pushViewController(LGSectionViewController(), animated: true)
self?.tableView.deselectRow(at: indexPath, animated: true)
}).disposed(by: self.disposeBag)
去掉点击事件
// tableView复选点击事件
tableView.rx.itemDeselected.subscribe(onNext: { (indexPath) in
print("再次点击\(indexPath)行")
}).disposed(by: self.disposeBag)
移动事件
// tableView移动事件
tableView.rx.itemMoved.subscribe(onNext: { [weak self] (sourceIndex,destinationIndex) in
print("从\(sourceIndex)移动到\(destinationIndex)")
self?.viewModel.dataArray.swapAt(sourceIndex.row, destinationIndex.row)
self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag
删除事件
// tableView删除事件
tableView.rx.itemDeleted.subscribe(onNext: { [weak self](indexPath) in
print("点击删除\(indexPath)行")
self?.viewModel.dataArray.remove(at: indexPath.row)
self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag)
新增事件
// tableView新增事件
tableView.rx.itemInserted.subscribe(onNext: { [weak self](indexPath) in
print("添加数据在\(indexPath)行")
guard let model = self?.viewModel.dataArray.last else{
print("数据有问题,无法新增")
return
}
self?.viewModel.dataArray.insert(model, at: indexPath.row)
self?.loadUI(obSubject: dataOB)
}).disposed(by: self.disposeBag)
注意:一定要 [weak self]
。
2:分组tableView的实现(中介者)
let tableViewDataSource = RxTableViewSectionedReloadDataSource<SectionModel<String,LGSectionModel>>(configureCell: { [weak self](dataSource, tab, indexPath, model) -> LGTableViewCell in
let cell = tab.dequeueReusableCell(withIdentifier: self?.resuseID ?? "resuseID_LGSectionViewController", for: indexPath) as! LGTableViewCell
cell.setUISectionData(model)
cell.selectionStyle = .none
return cell
}
SectionModel
底层封装
public struct SectionModel<Section, ItemType> {
public var model: Section
public var items: [Item]
public init(model: Section, items: [Item]) {
self.model = model
self.items = items
}
}
返回的就是model,所以在外面的数据加载的时候可以取到model。可以自定义类型。
public var identity: Section {
return model
}
header
闭包
,titleForHeaderInSection: { dataSource,index -> String in
// print("数据:\(dataSource.sectionModels[index].identity)")
return dataSource.sectionModels[index].model
})
加载数据
self.data.githubData.asDriver(onErrorJustReturn: [])
.drive(self.tableView.rx.items(dataSource: tableViewDataSource))
.disposed(by: self.disposeBag)