如何从一个 xib 文件中注册多个 TableViewCells?

How Register Multiple TableViewCells from a xib file?

我在 Swift 4 工作,我在 UITableViewCell 遇到问题。我需要 5 种不同类型的单元格,所以我制作了一个 .xib 文件并创建了 5 个单元格。但是当使用相同的 xib 和不同的 Cell 标识符在 TableViewController class 中注册 nib 时..它崩溃了:

错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'invalid nib registered for identifier (IntakeFormTextFieldCell) - nib must contain exactly one top level object which must be a UITableViewCell instance

我的代码是:

override func viewDidLoad() {
    super.viewDidLoad()
    intakeFormTableView.register(UINib(nibName: "IntakeFormViews", bundle: nil), forCellReuseIdentifier: "IntakeFormTextFieldCell")
    intakeFormTableView.register(UINib(nibName: "IntakeFormViews", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell")
    // Do any additional setup after loading the view.
}

我粗略的 xib 文件是:

我的问题是如何使用一个 xib 文件中的不同单元格?有什么简单又好的练习方法吗?

正如崩溃所说,您必须在单元格笔尖中只有一个顶级对象,即单元格视图本身,因此从单元格内容中删除任何拖动的对象

我认为您没有提供单元格的标识符 "IntakeFormTextFieldCell" 和 "IntakeFormButtonCell",因此您的应用程序崩溃了。

intakeFormTableView.register(UINib(nibName: "IntakeFormViews", bundle: nil), forCellReuseIdentifier: "IntakeFormTextFieldCell")
intakeFormTableView.register(UINib(nibName: "IntakeFormViews", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell")

每个单元格显示与 swift 文件有不同的 xib,应该用 UITableViewCell

覆盖

您不能在一个 xib 上创建多个自定义单元格。您需要为 5 个不同的单元格创建 5 个不同的 Xib。也很容易让你看懂代码流程。

override func viewDidLoad() {
   super.viewDidLoad()
   intakeFormTableView.register(UINib(nibName: "IntakeFormViews1", bundle: nil), forCellReuseIdentifier: "IntakeFormTextFieldCell1")
   intakeFormTableView.register(UINib(nibName: "IntakeFormViews2", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell2")
   intakeFormTableView.register(UINib(nibName: "IntakeFormViews3", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell3")
   intakeFormTableView.register(UINib(nibName: "IntakeFormViews4", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell4")
   intakeFormTableView.register(UINib(nibName: "IntakeFormViews5", bundle: nil), forCellReuseIdentifier: "IntakeFormButtonCell5")
// Do any additional setup after loading the view.
}

Swift 5

 override func viewDidLoad() {
    super.viewDidLoad()

       // Register nib.
       self.tableView.register(UINib(nibName: "Nib1", bundle: nil), forCellReuseIdentifier: "Nib1_name_cell")
       self.tableView.register(UINib(nibName: "Nib2", bundle: nil), forCellReuseIdentifier: "Nib2_name_cell")
 }