整洁,小巧的代码--- 代码复用
2015-08-10 本文已影响67人
DevKyle
MVC
在MVC设计模式中,我们应该把代码放置在合适、正确的位置。
- 关于视图的代码,比如label,button等控件的定义,声明放在View层下面
- 关于模型的代码,比如需要显示在视图上的数据(datasorce),label的title;网络数据的抓取工作(数据和处理数据的方法)声明在Model层
- 关于控制器的代码,比如使Model层上的数据在View层显示,Model层方法的调用,不同MVC之间的通信。声明调用在Controller层上。Controller层主要声明一些Model类型的变量,这些变量的作用是为了在视图上显示的数据源。
例子
在平时程序中,要用到大量的tableView,经常会用到大量的UITableDataSourceDelegate
方法,我们通过将这部分关于datasource的类放在Mode层l中去,减少在controller中的代码。用一个简单的例子 来说明一下。这个例子就是两个tableview的跳转
Model层
将tableviewdatasource表示出来,这里没有处理数据的方法,只需要表示显示在View上的数据。
第一个tableview
//firstcelldata
import UIKit
class FirstCellData {
var title:String?
init(){}
}
第二个tableviewdata
import Foundation
/// secondCellData
class SecondCellData {
var title:String?
var subtitle:String?
}
View层
View层主要关注的是在视图上所需要的控件,例子里主要是Label
对于第一个tableview
import UIKit
class FirstCell: UITableViewCell {
func configureForCell(item: FirstCellData!) {
self.textLabel!.text = item.title
}
}
第二个tableview
import UIKit
class SecondCell: UITableViewCell {
func configureForCell(item: SecondCellData!) {
self.textLabel!.text = item.title;
self.detailTextLabel!.text = item.subtitle;
}
}
Controller
对于tableview datasource的处理主要有numberOfRowsInSection和cellForRowAtIndexPath这两个方法,这里将它提取出来写。全局变量有存储数据的数组,reuseIndentifier用于指定storyboard中cellIndentifier,一个closure用于处理数据和View的绑定,下面是几句关键代码
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return cellData!.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier!)
configureCell!(cell!,cellData![indexPath.row])
return cell!
}
在tableview中使用这个datasource
import UIKit
class SecondTableViewController: UITableViewController {
var items:Array<SecondCellData> = []
var customDataSource:CustomDataSource?
let cellIdentifier = "secondCell"
override func viewDidLoad() {
super.viewDidLoad()
initData()
setupTableView()
}
func initData(){
for i in 1...50{
let secondData = SecondCellData()
secondData.title = "the title is \(i)"
secondData.subtitle = " the subtitle is \(i)"
items.append(secondData)
}
}
func setupTableView() {
customDataSource = CustomDataSource(cellData: items, cellIdentifier: cellIdentifier, configureCell: {(cell, firstCellData) in
let firstCell = cell as! SecondCell
firstCell.configureForCell(firstCellData as! SecondCellData)
})
self.tableView.dataSource = customDataSource
}
}