import UIKit
// 添加两个代理协议:表格视图代理协议 UITableViewDelegate;表格视图数据源协议 UITableViewDataSource
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// 代理方法,用来设置表格视图,返回单元格行数
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return weeks.count
}
// 代理方法,用来设置表格行的高度
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
// 代理方法,用来初始化或复用表格视图中的单元格
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 索引路径用来标识单元格在表格中的位置。它有section(段落)和row(行)两个属性
let rowNum = indexPath.row
// 创建一个字符串,作为单元格的复用标识符,不同的样式用不同的标识符
let identifier = weeks[rowNum]
// 单元格的标识符,可以看作是一种复用机制。此方法可以从所有已经开辟内存的单元格里面,选择一个具有同样标识符的、空闲的单元格
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
// 如果在可复用的单元格队列中,没有可复用的单元格,则创建新的单元格。新的单元格具有系统默认样式,并拥有一个复用标识符
if cell == nil {
cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: identifier)
}
cell?.textLabel?.text = weeks[rowNum]
cell?.detailTextLabel?.text = "Detail infomation here"
if weeks[rowNum] == "Tuesday" {
cell?.imageView?.image = UIImage(named: "icon-1024")
cell?.backgroundColor = UIColor.blue
cell?.textLabel?.textColor = UIColor.white
}
return cell!
}
// 代理方法,用来响应单元格的点击事件
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// 获取表格中被点击的单元格
let cell = tableView.cellForRow(at: indexPath)
if cell?.accessoryType == UITableViewCellAccessoryType.none {
cell?.accessoryType = UITableViewCellAccessoryType.checkmark
} else {
cell?.accessoryType = UITableViewCellAccessoryType.none
}
}
// 代理方法,用来设置单元格的编辑模式
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
if indexPath.row == 0 {
return UITableViewCellEditingStyle.insert
} else {
return UITableViewCellEditingStyle.delete
}
}
// 代理方法,用来响应单元格的commit事件
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
let rowNum = indexPath.row
if editingStyle == UITableViewCellEditingStyle.delete {
// 数组中清除数据,以保证数据的一致性
weeks.remove(at: rowNum)
// 表格视图中删除该行
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
} else if editingStyle == UITableViewCellEditingStyle.insert {
weeks.insert("\(id) new day", at: rowNum)
id += 1
tableView.insertRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
}
}
// 代理方法,用来设置单元格是否允许拖动换行
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return indexPath.row != 0
// return true
}
// 代理方法,用来响应单元格的移动事件
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
let fromRow = sourceIndexPath.row
let toRow = destinationIndexPath.row
let day = weeks[fromRow]
weeks.remove(at: fromRow)
weeks.insert(day, at: toRow)
}
// 滚动到表格顶部
@objc func scrollToTop(_: AnyObject) {
let indexPath = IndexPath(row: 0, section: 0)
tableView.scrollToRow(at: indexPath, at: UITableViewScrollPosition.top, animated: true)
}
// 切换表格的编辑状态
@objc func switchEdit(_ button: UIButton) {
let isEditing = tableView.isEditing
button.setTitle(isEditing ? "edit" : "done", for: UIControlState())
tableView.setEditing(!tableView.isEditing, animated: true)
}
var id = 0
var weeks = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
let topButton = UIButton(type: UIButtonType.system)
let editButton = UIButton(type: UIButtonType.system)
// 初始化一个表格视图
let tableView = UITableView(frame: CGRect(x: 0, y: 40, width: 320, height: 420))
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
tableView.backgroundColor = UIColor.gray
tableView.tableFooterView = UIView(frame: CGRect.zero)
topButton.frame = CGRect(x: 100, y: 480, width: 100, height: 30)
topButton.setTitle("scroll to top", for: UIControlState())
topButton.addTarget(self, action: #selector(ViewController.scrollToTop(_:)), for: UIControlEvents.touchUpInside)
self.view.addSubview(topButton)
editButton.frame = CGRect(x: 220, y: 480, width: 50, height: 30)
editButton.setTitle("edit", for: UIControlState.normal)
editButton.addTarget(self, action: #selector(ViewController.switchEdit(_:)), for: UIControlEvents.touchUpInside)
self.view.addSubview(editButton)
self.view.addSubview(tableView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
另外发现个恼人的BUG,动态添加的cell在删除的时候会出现删除动画渲染问题
网友评论