苹果官方在2015的开发者大会上提出swift面向协议编程这个思想,下面用swift面向协议编程实现--组件化:
现在要实现一个下拉刷新组件(以下栗子用到了MJRefresh刷新框架):
平常在很多场景都用到这个控件,例如tableview ,webview, scrollview多个控件都可能用到.
面向对象编程栗子:
用面向对象的思想在多个地方用到的时候我们通常都是创建一个基础父类,如我创建了一个BaseRefreshTableController 只要是tableviewController继承都能下拉刷新的的父类
override func viewDidLoad() {
super.viewDidLoad()
self.tableView.mj_header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: "refreshingAction:")
}
func refreshingAction(refreshControl:MJRefreshNormalHeader) {
refreshControl.beginRefreshing()
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
refreshControl.endRefreshing()
self.tableView.reloadData()
}
}
面向协议编程的栗子:
首先创建一个PotocolComponent.swift 的组件文件,专门保存属于我们编程兵器库.下面来创建属于我们的第一个组件
//MARK:---------------------------刷新组件--------------------------
protocol RefreshControl { //协议是不允许写实现的
func refreshingAction(refreshControl:MJRefreshNormalHeader)
}
extension RefreshControl { //但拓展是允许写默认实现的
func setupRefreshControl(scrollView:UIScrollView,target:AnyObject!) {
let header = MJRefreshNormalHeader(refreshingTarget: target, refreshingAction: "refreshingAction:")
scrollView.mj_header = header
header.loadingView.color = UIColor.redColor()
}
}
使用:
class RefreshController: UITableViewController,RefreshControl {
override func viewDidLoad() {
self.setupRefreshControl(self.tableView, target: self)
}
func refreshingAction(refreshControl: MJRefreshNormalHeader) {
refreshControl.beginRefreshing()
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(3.0 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
refreshControl.endRefreshing()
self.tableView.reloadData()
}
}
}