如何为 table 视图单元格制作和使用 XIB 文件,而不是仅仅使用故事板中的 table 视图单元格 "in"?

How do you make and use an XIB file for a table view cell, rather than just using a cell "in" the table view in storyboard?

在普通故事板中,table 次浏览来自 "with" 个嵌入式单元格。只需将 "Dynamic Prototypes" 设置为 1(或更多):

然后您只需使用

在您的视图控制器中使用这些单元格
...cellForRowAt

  let cell = tableView.dequeueReusableCell(
     withIdentifier:"YourCellClassID", for: indexPath) as! YourCellClass

其中YourCellClass是table视图单元格的class,

而字符串 "YourCellClassID" 就是

"Identifier" 设置在故事板的 Attributes Inspector(现在是**第 5 个 按钮)**。

(注意不要在 第 4 个 按钮上使用 "restoration identifier",identity inspector,这听起来相同但无关。)

但是如果您想使用 XIB 文件怎么办?

故事板中的 table 视图不是使用原型之一 "in" 吗?

如果您使用 XIB 文件,则可以在不同的 table 中使用 相同的单元格

怎么做?

第 1 步,制作单元格样式的 XIB 文件

当前 (2020) Xcode 没有直接按钮来创建 table view cell 样式的 XIB 文件。

秘密是

  1. 创建一个'Cocoa Touch Class'、select UITableViewCell

  2. 还有select'create XIB file'

您现在有一个单元格样式的 XIB 文件,示例中 TesteCell.xib。

(如果不需要TesteCell.swift,请随意删除。)

第2步,在viewDidLoad中添加register#UINib代码

如果你现在试试这个:

let cell = tableView.dequeueReusableCell(
              withIdentifier: "TesteCellID",
              for: indexPath) as! TesteCell

事实上它起作用。

viewDidLoad中,必须加上

override func viewDidLoad() {
    super.viewDidLoad()
    // We will be using an XIB file, rather than
    // just a cell "in" the table view on storyboard
    tableView.register(
        UINib(nibName: "filename without suffix", bundle: nil),
        forCellReuseIdentifier: "identifier in attributes inspector"
    )
}

在例子中

override func viewDidLoad() {
    super.viewDidLoad()
    // We will be using an XIB file...
    tableView.register(
        UINib(nibName: "TesteCell", bundle: nil),
        forCellReuseIdentifier: "TesteCellID")
}

你就是这样做的。

总结

  1. 新文件 - cocoa touch class - table 单元格的 subclass - do select 'also create XIB file'

  2. 在viewDidLoaed中,使用

    注册XIB文件
  3. 文件名(无后缀)和标识符

  4. 大功告成,现在可以正常引用dequeueReusableCell

    中的单元格了