美文网首页Swift开发进阶Swift
RxSwift 深入浅出(五)tableView应用

RxSwift 深入浅出(五)tableView应用

作者: Cooci_和谐学习_不急不躁 | 来源:发表于2018-08-25 16:38 被阅读136次

    RxSwift 这个框架看我就够了,这一篇我重点介绍RxSwift在实际开发中的运用。搞RxSwift,我是认真的

    RxSwift 宝图镇博,咔咔点赞~~~~

    Rxswift
    import UIKit
    
    class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource{
    
        var tableView : UITableView!
        let reuserId = "reuserId"
        
        override func viewDidLoad() {
            super.viewDidLoad()
            testUITableView()
        }
        
        func testUITableView(){
            
            tableView = UITableView(frame: self.view.bounds, style: .plain)
            tableView.delegate = self
            tableView.dataSource = self
            tableView.register(MyTableViewCell.self, forCellReuseIdentifier: MyTableViewCell.description())
            self.view.addSubview(tableView)
        }
    
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 10
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: MyTableViewCell.description(), for: indexPath) as? MyTableViewCell
            cell?.getvalue(titleStr: "\(indexPath.row)", nameStr: "  Cooci  \(indexPath.row)")
            return cell!
        }
        
        func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            self.navigationController?.pushViewController(RxSwiftTableVC(), animated: true)
        }
    
    
    }
    
    
    class MyTableViewCell: UITableViewCell {
        
        var titlteLabel:UILabel?
        var nameLabel:UILabel?
        
        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            
            self.titlteLabel = UILabel(frame: CGRect(x: 10, y: 0, width: 100, height: self.contentView.bounds.height))
            self.contentView.addSubview(self.titlteLabel!)
            
            self.nameLabel = UILabel(frame: CGRect(x: self.titlteLabel!.bounds.maxX, y: 0, width: 100, height: self.contentView.bounds.height))
            self.contentView.addSubview(self.nameLabel!)
            
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        func getvalue(titleStr:String,nameStr:String){
            self.titlteLabel?.text = titleStr
            self.nameLabel?.text = nameStr
        }
        
    }
    

    我们实际开发tableview 是非常难受的,因为每次都需要写两个代理UITableViewDelegate,UITableViewDataSource,很多的时候代码都分离开来,并且代码会随着项目越来越大,最后你看都觉得恶心

    • 代码量大
    • 代码逻辑,与需求逻辑分离

    下面我们来看看RxSwift的爽,爽,爽

    
    class RxSwiftTableVC: UIViewController {
        
        var myTableView:UITableView!
        let reuserId = "cell"
        let disposeB = DisposeBag()
        let datas = GithubData()
        
        override func viewDidLoad() {
            super.viewDidLoad()
            self.title = "RxSwift进阶";
            self.view.backgroundColor = UIColor.white
            self.myTableView = UITableView(frame: self.view.bounds, style: UITableViewStyle.plain)
            self.view.addSubview(self.myTableView)
            self.myTableView.register(SectionTableCell.self, forCellReuseIdentifier: reuserId)
    
          let items = Observable.just(InfoViewModel().arr)
            
            items.bind(to: self.myTableView.rx.items) { (tb, row, model) -> UITableViewCell in
                
                let cell = tb.dequeueReusableCell(withIdentifier: self.reuserId) as? MyTableViewCell
                cell?.titlteLabel?.text = model.despStr
                cell?.nameLabel?.text = model.nameStr
                return cell!
                }
                .disposed(by: disposeB)
            
            myTableView.isEditing = true
            
            myTableView.rx.itemSelected
                .subscribe(onNext: { indexPath in
                    print("选中项的indexPath为:\(indexPath)")
                })
                .disposed(by: disposeB)
            
            myTableView.rx.modelSelected(DataModel.self)
                .subscribe(onNext: { (model) in
                    print("点击了 \(model.despStr) :\(model.nameStr)" )
                })
                .disposed(by: disposeB)
            
            myTableView.rx.itemDeleted
                .subscribe(onNext: { (indexPath) in
                    print("删除 \(indexPath)")
                })
                .disposed(by: disposeB)
            
            myTableView.rx.itemMoved
                .subscribe(onNext: { (soureIndex,destiIndex) in
                    print("从 \(soureIndex)移动到 \(destiIndex)")
                })
                .disposed(by: disposeB)
            
            myTableView.rx.itemInserted
                .subscribe(onNext: { indexPath in
                    print("从 \(indexPath) 插入")
                })
                .disposed(by: disposeB)
        }
       
    }
    
    struct DataModel {
        let despStr:String
        let nameStr:String
    }
    
    struct InfoViewModel {
        var arr = Array<DataModel>()
        init(){
            arr.append(DataModel(despStr: "first", nameStr: "Cooci"))
            arr.append(DataModel(despStr: "2", nameStr: "Gavin"))
            arr.append(DataModel(despStr: "3", nameStr: "James"))
            arr.append(DataModel(despStr: "4", nameStr: "Dean"))
            arr.append(DataModel(despStr: "5", nameStr: "Kody"))
        }
    }
    

    这里看一下,是不是贼爽,实现cell的移动,删除,选择,逻辑都是简单到一句代码,不需要次重复的代理

    相关文章

      网友评论

        本文标题:RxSwift 深入浅出(五)tableView应用

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