为啥我的 TableView 单元格需要重用标识符?

Posted

技术标签:

【中文标题】为啥我的 TableView 单元格需要重用标识符?【英文标题】:Why do my TableView cells need reuse identifiers?为什么我的 TableView 单元格需要重用标识符? 【发布时间】:2020-12-31 00:15:56 【问题描述】:

为了练习我的编程并跟踪我的进度,我正在为自己构建一个应用程序。我为每个要求创建了一个表格视图和每个部分和独立的单元格。现在 Xcode 不高兴了,因为每个原型单元都没有标识符。

我查看了 Swift 文档并浏览了有关该主题的 Youtube 视频,但我仍然不明白重用标识符是什么或它们的用途,更不用说它对我的情况有何帮助了。

【问题讨论】:

这是因为UITableView 可以有多个自定义单元格。所以你必须告诉表格视图哪一组行从哪个表格视图单元格中获取单元格。 【参考方案1】:

如果您正在为每个值创建一个新单元格(“数组函数”、“Cocoapods”等)。如果使用单元原型,您通常不会这样做。您通常会有一个原型单元格,例如,一个重用标识符为SkillCell 的原型单元格,其标签将居中对齐。因此,您不会在故事板中看到所有这些不同的技能,而是您的表格视图的数据源会提供值,实例化您重复使用的 SkillCell 单元格,并将技能名称传递给它:

所以你的故事板可能看起来像

然后你会以编程方式填充它:

struct Skill 
    let name: String


struct SkillLevel 
    let name: String
    let skills: [Skill]


class ViewController: UIViewController 
    let sections = [
        SkillLevel(name: "Minimum Required Skills", skills: [
            Skill(name: "Array Functions"),
            Skill(name: "CocoaPods"),
            Skill(name: "API Requests"),
            Skill(name: "JSON")
        ]),
        SkillLevel(name: "Intermediate Required Skills", skills: [
            Skill(name: "Grand Central Dispatch"),
            Skill(name: "Combine"),
            Skill(name: "MVC vs MVP vs MVVM vs MVVM-C")
        ])
    ]


extension ViewController: UITableViewDataSource 
    func numberOfSections(in tableView: UITableView) -> Int 
        return sections.count
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return sections[section].skills.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "SkillCell", for: indexPath) as! SkillCell
        cell.skillLabel.text = sections[indexPath.section].skills[indexPath.row].name
        return cell
    


extension ViewController: UITableViewDelegate 
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
        return sections[section].name
    

产量:

现在,如果您想在 IB 中添加所有这些技能,那很好,您可以这样做,但您通常不会使用原型单元格(每个单元格都有自己的重用标识符),而是使用静态表格视图单元格。

【讨论】:

以上是关于为啥我的 TableView 单元格需要重用标识符?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 Tableview 重用了一些单元格?

使用带标识符的双端可重用单元格获取 UIView 时,UIFooterView 未显示

Tableview 单元格可重用性,切割标签文本

当它们几乎没有区别时,我应该重用 tableView 单元格吗? [关闭]

重用的 tableView 单元格不调用 layoutSubviews 方法

重用自定义 tableView 单元格时重复显示相同的子视图(Swift 4.1)