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

时间:2018-02-01 07:08:00

标签: ios swift uitableview xib

我在Swift 4工作,我在[ %{id: 1, title: "AAA", user_name: "John", tags: [%{name: "elixir"},...]}, %{id: 2, title: "BBB", user_name: "Mike", tags: [%{name: "erlang"},...]}, ... ] 面临问题。我需要5种不同类型的单元格,所以我创建了一个.xib文件并创建了5个单元格。但是当在TableViewController类中使用相同的xib和不同的Cell标识符注册nib时,它崩溃了:

错误:

  

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'无效的nib已注册   对于标识符(IntakeFormTextFieldCell) - nib必须完全包含   一个顶级对象,必须是UITableViewCell实例

我的代码是:

UITableViewCell

我粗略的xib文件是: enter image description here

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

4 个答案:

答案 0 :(得分:4)

您无法在One 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.
}

答案 1 :(得分:0)

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

enter image description here

答案 2 :(得分:0)

我认为你没有给出标识符" IntakeFormTextFieldCell"和" IntakeFormButtonCell"您的单元格,以便您的应用程序崩溃。

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

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

答案 3 :(得分:0)

斯威夫特 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")
 }