TableView

2025年3月17日 | 阅读 8 分钟

TableView 可以定义为使用单列中的行来排列数据的视图。它几乎用于每个 iOS 应用程序,例如,联系人、Facebook、Instagram 等。tableview 是 UITableView 类的实例,它继承了 UIScrollView 类。我们将在本教程的后续章节中讨论 UIScrollView。

在 iOS 应用程序中,每当我们需要显示包含垂直滚动内容的单列时,我们都使用 tableview。tableview 可以显示多个记录(分为行),如果需要,可以垂直滚动。 tableview 的每一行都呈现数据源的每个记录。例如,在联系人应用程序中,我们在 tableview 的单独行中显示每个联系人姓名,并且单击该行即可获得与联系人相关的详细信息。

下图显示了如何在设置应用程序中使用 tableview 显示数据。

iOS TableView

下图显示了如何在联系人应用程序中使用 tableview。

iOS TableView

我们可以在 tableview 中创建部分以对相关行进行分组,或者我们可以在没有部分的情况下在多行中显示长列表的记录。

在 iOS 应用程序中,tableview 与导航控制器结合使用,以按层次结构组织数据。 在这里,我们可以使用导航控制器在不同的层次结构级别之间导航。

tableview 的外观由 UITableView 类管理,该类继承了 UIScrollView。在 tableview 中,行由 UITableViewCell 类的对象模拟,该对象可用于显示实际内容。我们可以自定义 tableview 单元格以在 iOS 应用程序中显示任何内容。

将 UITableView 添加到界面

要将 tableview 添加到情节提要,请在对象库中搜索 Tableview,然后将结果拖到情节提要。

iOS TableView

要使用 tableview,我们需要设置其委托和数据源属性。 tableview 是一个数据驱动的对象,即,它从数据源对象获取要显示的数据。在实际应用程序中,数据源对象包含由来自数据库服务器的 API 调用返回的数据。

可以使用以下代码行在 ViewController 的 viewDidLoad 方法中设置 tableview 的委托和数据源属性。

TableView 委托方法

定义 tableview 委托方法是为了向 tableview 添加以下功能。

  • 我们可以为 tableview 中的部分创建自定义的标题和页脚。
  • 我们可以为行、标题和页脚指定自定义高度。
  • 为行、标题和页脚提供高度估计。
  • 我们可以定义可以处理行选择的方法。
序号方法描述
1func tableView(UITableView, willDisplay: UITableViewCell, forRowAt: IndexPath)当 tableview 即将绘制特定行的单元格时,它会通知此委托。
3func tableView(UITableView, willSelectRowAt: IndexPath) -> IndexPath?当即将选择指定的行时,tableview 会通知此委托方法。
4func tableView(UITableView, didSelectRowAt: IndexPath)当选择 tableview 的指定行时,会通知此委托。
5func tableView(UITableView, willDeselectRowAt: IndexPath) -> IndexPath?当即将取消选择特定单元格时,会通知此委托。
6func tableView(UITableView, didDeselectRowAt: IndexPath)当取消选择特定行时,会通知此委托。
7func tableView(UITableView, viewForHeaderInSection: Int) -> UIView?此委托方法返回一个 UIView,它表示 tableview 的标题。
8func tableView(UITableView, viewForFooterInSection: Int) -> UIView?此委托方法返回 uiview,它表示 tableview 的页脚。
9func tableView(UITableView, willDisplayHeaderView: UIView, forSection: Int)当 tableview 即将显示特定部分的标题视图时,会通知此委托方法。
10func tableView(UITableView, willDisplayFooterView: UIView, forSection: Int)当 tableview 即将显示特定部分的页脚视图时,会通知此委托方法。
11func tableView(UITableView, heightForRowAt: IndexPath) -> CGFloat此委托方法返回行的高度。
12func tableView(UITableView, heightForHeaderInSection: Int) -> CGFloat此委托方法返回 tableview 中节的标题的高度。
13func tableView(UITableView, heightForFooterInSection: Int) -> CGFloat此委托方法返回 tableview 中特定节的页脚的高度。
14func tableView(UITableView, estimatedHeightForRowAt: IndexPath) -> CGFloat它要求委托估算特定位置的行的高度。
15func tableView(UITableView, estimatedHeightForHeaderInSection: Int) -> CGFloat它要求委托估算特定位置的标题的高度。
16func tableView(UITableView, estimatedHeightForFooterInSection: Int) -> CGFloat它要求委托估算特定部分的页脚的高度。

TableView 数据源方法

为了维护 tableview 要显示的数据,我们需要维护一个实现 UITableViewDataSource 协议的 DataSource 对象。 数据源对象管理 tableview 数据。 数据源对象执行以下主要任务。

  1. 它报告要在 tableview 中显示的行数和部分数。
  2. 它为 tableview 中的每一行分配可重用的单元格。
  3. 它为 tableview 部分中的标题和页脚提供标题。

为了执行上述任务,UITableviewDataSource 协议中定义了一些函数。 下表包含协议中定义的重要方法。

序号方法描述
1func tableView(UITableView, numberOfRowsInSection: Int) -> Int此方法返回要在 tableview 的节中显示的行数。
2func numberOfSections(in: UITableView) -> Int此方法返回要在 tableview 中显示的部分数。
3func tableView(UITableView, cellForRowAt: IndexPath) -> UITableViewCell此方法返回 UITableViewCell 的对象,该对象显示 tableview 中特定行的实际内容。 此方法在 tableview 中插入特定行的单元格。
4func tableView(UITableView, titleForHeaderInSection: Int) -> String?此方法返回一个字符串,表示 tableview 的节中标题的标题。
5func tableView(UITableView, titleForFooterInSection: Int) -> String?此方法返回一个字符串,表示 tableview 的节中页脚的标题。
7func tableView(UITableView, canEditRowAt: IndexPath) -> Bool它要求 DataSource 验证特定行是否可编辑。
8func tableView(UITableView, canMoveRowAt: IndexPath) -> Bool它要求 DataSource 验证特定行是否可以移动到 tableview 中的另一个位置。
9func tableView(UITableView, moveRowAt: IndexPath, to: IndexPath)此方法将特定行移动到 tableview 中的其他位置。
10func sectionIndexTitles(for: UITableView) -> [String]?它返回包含 tableview 中各节标题的字符串数组。

如果 ViewController 实现了 UITableViewDatasource 协议,则需要定义两种方法,这在以下代码中提到。

示例 1

在此示例中,我们将创建一个简单的 tableview,其中显示 2019 年排名前 10 的编程语言的列表。在本示例中,我们将使用 UITableView 来创建界面生成器,并使用委托和数据源方法来设置 tableview 中的数据。

界面生成器

在此示例中,我们将通过将 tableview 添加到界面生成器来创建以下视图控制器。 我们还将使用标签对象来显示 tableview 的标题。 我们将向此 tableview 添加一个原型单元格,并为此 ViewController 分配 ViewController.swift 类。

iOS TableView

ViewController.swift

在 ViewController.swift 中,我们将创建添加到情节提要的 tableview 的连接出口。 我们还将定义委托和数据源方法来显示 tableview 数据。

输出

iOS TableView

示例:处理 tableview 中的多个部分

在此示例中,我们将在 tableview 中创建多个部分,并且我们将根据特定部分定义可变数量的行和行内容。

界面生成器

要为此示例创建界面生成器,我们需要添加一个 tableview 并为 tableview 添加一个原型单元格。 带有原型单元格的界面生成器如下图所示。

iOS TableView

ViewController.swift

示例 2:自定义 Table View 单元格

在此示例中,我们将通过将 tableview 单元格分配给一个类并在该类中创建单元格对象的出口来自定义 tableview 单元格。 在大多数 iOS 应用程序中,都需要自定义 tableview 类,因为我们不能总是仅通过设置单元格的标签文本来满足我们的要求。

此示例模拟了 ECommerce 应用程序中显示的产品列表视图。

界面生成器

要为此示例创建界面生成器,我们需要将 tableview 添加到视图控制器,并将原型单元格添加到其中。 在内容视图原型单元格中,我们将添加一个 uiview,向其中添加 UIImageView 和 UILabel 对象。 下图显示了该示例中的情节提要。

iOS TableView

MyTableViewCell.swift

MyTableViewCell 继承了 UITableViewCell 类,该类已分配给 tableview 的原型单元格。 在此类中,我们可以实例化图像视图和标签对象。

ViewController.swift

iOS TableView
下一个主题iOS:CollectionView