UITableView


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在删除的时候会出现删除动画渲染问题

推荐阅读更多精彩内容