为什么我的 TableView 单元格需要重用标识符?
Why do my TableView cells need reuse identifiers?
为了练习我的编程并跟踪我的进度,我正在为自己构建一个应用程序。我为每个部分创建了一个表格视图,并为每个要求创建了独立的单元格。现在 Xcode 很沮丧,因为每个原型单元格都没有标识符。
我查看了 Swift 文档并浏览了有关该主题的 Youtube 视频,但我仍然不明白什么是重用标识符或它们的用途,更不用说它如何帮助我的情况。
如果看起来您正在为每个值创建一个新单元格(“数组函数”、“Cocoapods”等)。如果使用单元原型,您通常不会这样做。你通常会有一个单一的原型单元格,比如说,一个带有重用标识符 SkillCell
的单元格,它会有一个居中对齐的标签。因此,您不会在故事板中看到所有这些不同的技能,而是您的 table 视图的数据源将提供值,实例化您重复使用的 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 中添加所有这些技能,那很好,您可以这样做,但您通常不会使用原型单元(每个单元都有自己的重用标识符),而是静态的 table 查看单元格。
为了练习我的编程并跟踪我的进度,我正在为自己构建一个应用程序。我为每个部分创建了一个表格视图,并为每个要求创建了独立的单元格。现在 Xcode 很沮丧,因为每个原型单元格都没有标识符。
我查看了 Swift 文档并浏览了有关该主题的 Youtube 视频,但我仍然不明白什么是重用标识符或它们的用途,更不用说它如何帮助我的情况。
如果看起来您正在为每个值创建一个新单元格(“数组函数”、“Cocoapods”等)。如果使用单元原型,您通常不会这样做。你通常会有一个单一的原型单元格,比如说,一个带有重用标识符 SkillCell
的单元格,它会有一个居中对齐的标签。因此,您不会在故事板中看到所有这些不同的技能,而是您的 table 视图的数据源将提供值,实例化您重复使用的 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 中添加所有这些技能,那很好,您可以这样做,但您通常不会使用原型单元(每个单元都有自己的重用标识符),而是静态的 table 查看单元格。