indexpath.row 是否负责迭代数组?

Does indexpath.row take care of iterating an array?

我正在学习 UITableView 教程,并且在实现 UITableViewDataSource 方法时对数组迭代感到好奇。当我们调用indexPath.row的时候,这是不是在后台给我们调用了一个for循环?我问是因为几个月前我正在学习使用来自网络服务的数据(我已经忘记了我是如何精确地做到这一点的确切步骤)但我相信我需要遍历数组以便在控制台。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        // Create an instance of UITableViewCell, with default appearance
        let cell = UITableViewCell.init(style: .value1, reuseIdentifier: "UITableViewCell")

        // Set the text on the cell with the description of the item instance that is at the nth index of the allItems array, where n = row this cell will appear in on the tableview
        let item = itemStore.allItems[indexPath.row]

        cell.textLabel?.text = item.name
        cell.detailTextLabel?.text = "$\(item.valueInDollars)"

        return cell
    }

我认为 indexPath.row 方法在幕后为我们迭代数组是否正确?

let item = itemStore.allItems[indexPath.row]

没有。 indexPath 只是一个带有 sectionrow 的结构。您可以使用它们直接从数组中查找信息。没有迭代发生。

cellForRowAt 仅针对屏幕上的单元格调用,因此它们的调用顺序取决于您滚动的方向。

事实上,UITableView 甚至不知道您是在使用数组还是动态生成信息。您如何使用 indexPath rowsection 由您决定。

不,调用 indexPath.row 不会为您遍历所有行。它只是一个发送到 cellForRowAt 的变量,您可以访问并使用它来创建您的单元格。它包含有关函数 cellForRowAt 在哪个部分的哪一行被调用的信息。

但是,每次要在 tableVIew 上显示一个单元格时,实际上都会调用 cellForRowAt。想象一下,您有一个包含 100 个项目的 dataSource,并且一次只能看到 10 个单元格。当 tableView 最初加载时,cellForRowAt 将被调用 10 次。然后,如果您滚动 tableView 以显示另外 3 个单元格,cellForRowAt 将被调用 3 次。

首先教程似乎很糟糕。 Table 视图单元格应该被重复使用

let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell", for: indexPath)

显示 table 个视图单元格的工作流程是:

  • 框架调用 numberOfRowsInSection(以及 numberOfSections
  • 对于可见单元格范围内的每个 section/row 对,它调用 cellForRowAt 并在第二个参数中传递索引路径。

查看 UITableView 和 cellForRowAtIndexpath 函数的文档。

An index path locating a row in tableView.

IndexPath 将是一个结构,它可以帮助您从嵌套数组中获取特定位置。在您的 table 视图的情况下,该部分内的行。

cellForRow 将 return 特定索引路径的单元格(在指定的部分和行中)

因此 indexPath.section 将给出要修改单元格的节号,并 returned 到数据源。在该部分内,indexPath.row 将是该部分内的相应行。

index path documentation

tableView-CellForRowAt: IndexPath

UITableView DataSource Documentation

[更新]

如果要添加多个部分,请添加另一个数据源 numberOfSections,然后 return 从中计算部分数。

我可以 link 到 Apple 的 create a table view tutorial,但它是一个很长的文档,您可以跳过开头并阅读 在您的 [=64] 中显示一个部分=] 查看.

如果需要,您可以使用二维数组来保留部分和行。在 numberOfSections 方法 return array.count 和 numberOfRows:inSection, return 数组[section] .count

更多示例,

谢谢, J