Swift

RXSwift使用RXDataSource绑定tableView

2017-06-14  本文已影响1635人  StoneWing

前面介绍了RXSwift的简单实用:登陆示例,以及和MJRefresh来实现刷新分页,但是在实际开发中,这往往不够,比如我们需要绑定多个cell,比如我们需要分组section。这时候我们需要使用一个叫做RXDataSource的开源框架

根据上一节的内容,我这里还使用MJRefresh和Realm

let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Any>>()
let dataArray = Variable([SectionModel<String, Any>]())
self.dataSource.configureCell = { (dataSource, tableView, indexPath, model) in
//这里实现多个cell的获取,及数据设置
            switch self.type {
            case 5:
                let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.list_identifier) as! ClassWork_List_TableViewCell
                cell.model = model as! ClassWork_List_Model
                return cell
            case 6:
                let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.class_rank_identifier) as! Class_Ranking_CellTableViewCell
                let rank = model as! ClassWorkRankModel
                cell.nameLabel.text = rank.classname!
                cell.countLabel.text = "发布:\(rank.count)"
                return cell
            case 7:
                let cell = tableView.dequeueReusableCell(withIdentifier: ClassWorkViewController.people_rank_identfier) as! PeopleRankTableViewCell
                cell.model = model as! PeopleRankModel
                return cell
            default:
                return UITableViewCell()
            }
        }
 //dataArray绑定数据到datasource
 self.dataArray.asObservable()
            .bind(to: self.tableView.rx.items(dataSource: dataSource))
            .addDisposableTo(disposeBag)
 ClassWorkViewModel.shareInstance.refreshStatus.asObservable().bind { (status) in
            
            let realm = try! Realm()
            var array = [SectionModel<String, Any>]()
            //数据的获取
            switch self.type {
            case 5:
                let objects = realm.objects(ClassWork_List_Model.self).sorted(byKeyPath: "time", ascending: false)
                
                for model in objects {
                    array.append(SectionModel(model: "", items: [model]))
                }
                break
            case 6:
                let objects = realm.objects(ClassWorkRankModel.self).sorted(byKeyPath: "count", ascending: false)
                
                for model in objects {
                    array.append(SectionModel(model: "", items: [model]))
                }
                break
            case 7:
                let objects = realm.objects(PeopleRankModel.self).sorted(byKeyPath: "count", ascending: false)
                
                for model in objects {
                    array.append(SectionModel(model: "", items: [model]))
                }
                break
            default:
                break
            }
            
            self.dataArray.value = array
            //结束刷新/加载状态
            switch status {
            case .DropDownSuccess:
                self.tableView.mj_header.endRefreshing()
                break
            case .PullSuccessHasMoreData:
                self.tableView.mj_footer.endRefreshing()
                break
            case .PullSuccessNoMoreData:
                self.tableView.mj_footer.endRefreshingWithNoMoreData()
                break
            default:
                break
            }
            
            }.addDisposableTo(disposeBag)
self.tableView.rx
            .setDelegate(self)
            .addDisposableTo(disposeBag)
### 实现协议的方法
// MARK: - protocol UITableViewDelegate
extension ClassWorkViewController: UITableViewDelegate {
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        // self.dataSource[section].model 及设置的section的标题,及SectionModel<String,Ang>中的string
       
        return UIView()
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }
}
...

上一节:RXSwift+MJRefresh+Realm实现tableView的刷新(分页)

上一篇 下一篇

猜你喜欢

热点阅读