RXSwift學習(1)—tableView的簡單建立

一個蘿蔔壹個坑發表於2017-12-25

model與ViewModel的建立

1.model的建立

struct RootModel { let name:String let age:Int }

2.ViewModel的建立

//獲取資料

` class RootViewModel: NSObject {

func getNewsData() -> Observable<[SectionModel<String, RootModel>]> {
    return Observable.create{ (observer) -> Disposable in
        
        let array = [RootModel(name: "小明", age: 10),  RootModel(name: "小亮", age: 20), RootModel(name: "333", age: 30)]
        
        let section = [SectionModel(model: "", items: array)]
        observer.onNext(section)
        observer.onCompleted()
        
        return Disposables.create()
    }
}
複製程式碼

} `

3.TableViewCell的建立

`import UIKit

class RootTableViewCell: UITableViewCell {

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    self.addSubview(nameLabel)
    self.addSubview(ageLabel)
    
}
required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}



var model: RootModel? {
    didSet {
        nameLabel.text = model?.name
        ageLabel.text = String(describing: model!.age)
        
        
    }
}

// MARK: - 懶載入
lazy var ageLabel:UILabel = {
    var ageLabel:UILabel = UILabel(frame: CGRect(x: nameLabel.bounds.origin.x + 10, y: nameLabel.bounds.size.height + 10, width: UIScreen.main.bounds.width/2, height: 20))
    ageLabel.backgroundColor = UIColor.red
    ageLabel.textColor = UIColor.black
    return ageLabel
}()


lazy var nameLabel:UILabel = {
    
    var nameLabel:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width/2.0, height: 20))
    nameLabel.textColor = UIColor.darkGray
    nameLabel.textAlignment = NSTextAlignment.right
    nameLabel.backgroundColor = UIColor.blue
    return nameLabel

}()
複製程式碼

}

4.控制器中的具體實現

import Foundation import UIKit import RxSwift import RxCocoa import RxDataSources import Differentiator

`class TryTableViewViewController: UIViewController {

let disposeBag = DisposeBag()
// 建立DataSource
var dataSource = RxTableViewSectionedReloadDataSource<SectionModel<String,RootModel>>(configureCell: {
    _, tableView, indexPath, model in
    let cell = RootTableViewCell(style: .default, reuseIdentifier: "cell")
    //處理返回資料
    cell.model = model
    return cell
})
// 建立ViewModel,獲取資料
let viewModel = RootViewModel()`


override func viewDidLoad() {
    super.viewDidLoad()
    
    // 新增View
    view.addSubview(tableView)
    // 獲取資料
     viewModel.getNewsData().bind(to: tableView.rx.items(dataSource: dataSource)).disposed(by:disposeBag)
   

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

 // MARK: - 懶載入
lazy var tableView:UITableView = {
    var tableView = UITableView(frame: UIScreen.main.bounds, style: UITableViewStyle.plain)
    tableView.backgroundColor = UIColor.gray;
    // tableViewCell的點選事件
    tableView.rx.itemSelected.map { indexPath in
        return (indexPath,self.dataSource[indexPath])
        }
        .subscribe(onNext: { indexPath, model in
            
            print("\(model)")
            self.navigationController?.pushViewController(ViewController(), animated: true)
        })
        .disposed(by: disposeBag)
    
    // 設定tableView的代理
    tableView.rx.setDelegate(self)
        .disposed(by: disposeBag)
   
    return tableView
}()
複製程式碼

}'

`// 控制器的擴充套件,將tableView的一些代理在此實現

extension TryTableViewViewController : UITableViewDelegate {

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100;
}
複製程式碼

}`

參考文章

Swift中TableViewCell的建立

RXSwift在UITableView中使用

相關文章