1. 程式人生 > >IOS控制元件-UITableVIew

IOS控制元件-UITableVIew

UITableVIew的簡單實用

實現效果

//
//  ViewController.swift
//  DemoApp
//
//  Created by 郭文亮 on 2018/11/15.
//  Copyright © 2018年 finalliang. All rights reserveds
//
import UIKit
//新增兩個代理協議 表格檢視的資料來源協議 表格檢視的代理協議
class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
 
    override func viewDidLoad() {
        super.viewDidLoad();
        let tableView = UITableView(frame: self.view.bounds)
        //設定表格檢視的代理為根檢視控制器
        tableView.delegate = self
         //設定表格檢視的資源代理為根檢視控制器
        tableView.dataSource = self
        
        //初始化一個索引路徑。第1個段落的第16行
        let indexpath = IndexPath(row: 49, section:0)
        //讓表格滑動到指定位置
        tableView.scrollToRow(at: indexpath, at: UITableViewScrollPosition.bottom, animated: true)
        
        self.view.addSubview(tableView)
    }
    //代理方法。重寫的。設定表格檢視擁有單元格的行數
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 50
    }
    //代理方法。設定高度
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    //初始化或複用表格中的單元格
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let indetifier = "reusedCell"
        //單元格的識別符號。可以看作是一種複用機制。 此方法可以從已開闢記憶體的單元格里面選擇一個具有同樣標識的空閒的單元格
        var cell = tableView.dequeueReusableCell(withIdentifier: indetifier)
        //判斷在可重用單元格佇列中,是否有可以重複使用的單元格
        if (cell==nil) {
            //如果沒有可以重複使用的單元格,則建立新的單元格。
            //新的單元格具有i 系統預設的樣式,並擁有一個複用識別符號
            cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: indetifier)
        }
        //索引路徑用來標示單元格在表格中的位置 段落section  行數row
        let rowNum = (indexPath as NSIndexPath).row
        
        //預設的單元格,擁有一個標籤物件  物件的文字內容
        cell?.textLabel?.text = "第\(rowNum)個"
        //設定標籤的描述內容
        cell?.detailTextLabel?.text = "Detail information here"
        cell?.imageView?.image=UIImage(named: "Tab")
        cell?.imageView?.highlightedImage = UIImage(named: "Tab2")
        //設定背景色的兩種方式
        if (rowNum==3) {
            cell?.backgroundColor=UIColor.red
        }else{
            let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
            view.backgroundColor=UIColor.blue
            cell?.backgroundView=view
        }
        
        return cell!
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

自定義Tableview的Accessory樣式

import UIKit
class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
 
    override func viewDidLoad() {
        super.viewDidLoad();
        let tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 50
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let indetifier = "reusedCell"
        var cell = tableView.dequeueReusableCell(withIdentifier: indetifier)
        if (cell==nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: indetifier)
        }
        let rowNum = (indexPath as NSIndexPath).row
        cell?.textLabel?.text = "第\(rowNum)個"
        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
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

單元格的刪除

import UIKit
class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
    var months = ["1","2","3","4","5","6","7"]
    
    override func viewDidLoad() {
        super.viewDidLoad();
        let tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        self.view.addSubview(tableView)
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return months.count
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let indetifier = "reusedCell"
        var cell = tableView.dequeueReusableCell(withIdentifier: indetifier)
        if (cell==nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: indetifier)
        }
        let rowNum = (indexPath as NSIndexPath).row
        cell?.textLabel?.text = months[rowNum]
        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 {
        //設定為刪除模式
        return UITableViewCellEditingStyle.delete
    }
    
    //響應單元格的刪除事件
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        //判斷如果編輯模式為刪除 則執行刪除程式碼
        if editingStyle == UITableViewCellEditingStyle.delete {
            let rowNum = (indexPath as NSIndexPath).row
            months.remove(at: rowNum)
            //建立一個待刪除單元格的位置資訊陣列
            let indexPaths = [indexPath]
            tableView.deleteRows(at: indexPaths, with: UITableViewRowAnimation.automatic)
            
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

插入單元格

import UIKit
class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
    var months = ["1","2","3","4","5","6","7"]
    
    override func viewDidLoad() {
        super.viewDidLoad();
        let tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        //在預設狀態下開啟表格的預設編輯模式
        tableView.setEditing(true, animated: true)
        self.view.addSubview(tableView)
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return months.count
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let indetifier = "reusedCell"
        var cell = tableView.dequeueReusableCell(withIdentifier: indetifier)
        if (cell==nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: indetifier)
        }
        let rowNum = (indexPath as NSIndexPath).row
        cell?.textLabel?.text = months[rowNum]
        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 {
        //設定為插入模式
        return UITableViewCellEditingStyle.insert
    }
    
    //響應單元格的插入事件
    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        //判斷如果編輯模式為插入 則執行插入程式碼
        if editingStyle == UITableViewCellEditingStyle.insert {
            let rowNum = (indexPath as NSIndexPath).row
            months.insert("honey moon", at: rowNum)
            let indexPaths = [indexPath]
            tableView.insertRows(at: indexPaths, with: UITableViewRowAnimation.right)
            
        }
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

調整單元格順序

import UIKit
class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource{
    var months = ["1","2","3","4","5","6","7"]
    
    override func viewDidLoad() {
        super.viewDidLoad();
        let tableView = UITableView(frame: self.view.bounds)
        tableView.delegate = self
        tableView.dataSource = self
        //在預設狀態下開啟表格的預設編輯模式
        tableView.setEditing(true, animated: false)
        self.view.addSubview(tableView)
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return months.count
    }
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let indetifier = "reusedCell"
        var cell = tableView.dequeueReusableCell(withIdentifier: indetifier)
        if (cell==nil) {
            cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: indetifier)
        }
        let rowNum = (indexPath as NSIndexPath).row
        cell?.textLabel?.text = months[rowNum]
        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 {
        return UITableViewCellEditingStyle.none
    }
    //新增一個代理 用來設定單元格是否允許拖動換行
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    //新增一個代理 響應單元格的移動事件
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        let fromRow = sourceIndexPath.row//移動前的位置
        let toRow = destinationIndexPath.row//移動後的位置
        
        let obj = months[fromRow]//移動錢的物件
        
        months.remove(at: fromRow)
        months.insert(obj, at: toRow)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}