美文网首页Swift
RXSwift使用RXDataSource绑定tableView

RXSwift使用RXDataSource绑定tableView

作者: StoneWing | 来源:发表于2017-06-14 18:06 被阅读1635次

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

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

    • 这里使用RxTableViewSectionedReloadDataSource来控制cell的更新,SectionModel: string是section的标题,可以设置为空,为空的时候表示不分section(sectionnum = 1),这里model我是用的any,因为我多个cell需要的model不同

    let dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String, Any>>()
    let dataArray = Variable([SectionModel<String, Any>]())
    
    • 绑定tableView

    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)
    
    • 当然还可以设置tableview的delegate协议

    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的刷新(分页)

    相关文章

      网友评论

        本文标题:RXSwift使用RXDataSource绑定tableView

        本文链接:https://www.haomeiwen.com/subject/pmleqxtx.html