在 iOS 开发中,UITableView 是一个非常常用的 UI 组件,用于显示一个可滚动的列表。为了让 UITableView正常工作,通常需要遵循一些协议,并实现它们的相关方法。

UITableView 的常用协议

UITableView 有两个重要的协议:

  1. UITableViewDataSource:用于提供数据源,定义表格视图的内容。
  2. UITableViewDelegate:用于管理表格视图的交互行为,如行高、选择事件等。

下面是如何实现这两个协议的基本方法。

1. UITableViewDataSource 协议

该协议用于提供 UITableView 的数据内容。

常用方法

  • tableView(_:numberOfRowsInSection:):返回某个 section 中的行数。
  • tableView(_:cellForRowAt:):返回对应索引路径的 cell,通常在这里初始化并返回自定义的 UITableViewCell

示例代码

import UIKit

class MyViewController: UIViewController, UITableViewDataSource {

    var data = ["Item 1", "Item 2", "Item 3"]

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let tableView = UITableView()
        tableView.frame = self.view.bounds
        self.view.addSubview(tableView)
        
        // 注册 cell 类型
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        
        // 设置数据源
        tableView.dataSource = self
    }

    // 返回某个 section 中的行数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    // 配置并返回每一行的 cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }
}

2. UITableViewDelegate 协议

该协议用于处理用户的交互行为,比如点击某一行时触发的事件,或是控制行的高度等。

常用方法

  • tableView(_:didSelectRowAt:):当某一行被点击时调用。
  • tableView(_:heightForRowAt:):指定每一行的高度。
  • tableView(_:willDisplayCell:forRowAt:):当 cell 将要显示时调用,可以在这里执行额外的操作,如配置 cell 的动画。

示例代码

import UIKit

class MyViewController: UIViewController, UITableViewDelegate {

    var data = ["Item 1", "Item 2", "Item 3"]

    override func viewDidLoad() {
        super.viewDidLoad()

        let tableView = UITableView()
        tableView.frame = self.view.bounds
        self.view.addSubview(tableView)
        
        // 注册 cell 类型
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        
        // 设置数据源和代理
        tableView.dataSource = self
        tableView.delegate = self
    }

    // 行被点击时触发
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected Row \(indexPath.row)")
    }

    // 返回每一行的高度
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
}

3. 综合示例

以下是将 UITableViewDataSource 和 UITableViewDelegate 协议结合起来的完整示例:

import UIKit

class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var data = ["Item 1", "Item 2", "Item 3"]

    override func viewDidLoad() {
        super.viewDidLoad()

        // 创建 UITableView
        let tableView = UITableView()
        tableView.frame = self.view.bounds
        self.view.addSubview(tableView)
        
        // 注册 cell 类型
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        
        // 设置数据源和代理
        tableView.dataSource = self
        tableView.delegate = self
    }

    // 数据源方法:返回 section 中的行数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    // 数据源方法:配置并返回每一行的 cell
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]
        return cell
    }

    // 代理方法:当某行被点击时触发
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("Selected Row \(indexPath.row) - \(data[indexPath.row])")
    }

    // 代理方法:返回每行的高度
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 60
    }
}

4. UITableView 相关的其他重要方法

除了上面提到的常用协议方法,还有一些其他有用的 UITableView 方法:

  • reloadData():刷新整个表格视图的数据。
  • beginUpdates() / endUpdates():用于动画更新。
  • insertRows(at:with:) / deleteRows(at:with:):动态插入或删除行。
  • moveRow(at:to:):移动行的位置。

小结

  • UITableViewDataSource:负责提供数据,至少需要实现两个方法:numberOfRowsInSection 和 cellForRowAt
  • UITableViewDelegate:负责处理用户交互、行高等设置,可以选择性地实现方法。

UITableView 是 iOS 中非常常用的 UI 控件,通过遵循这两个协议,你就能非常灵活地管理和交互表格数据。如果需要更复杂的行为(例如自定义动画、插入和删除行等),你可以扩展这些方法来实现。