我可以在多个tableViews中使用单个原型单元吗?

时间:2012-10-22 04:58:53

标签: ios ios5 uitableview custom-cell

我在两个不同的控制器中有两个不同的tableviews。但我需要在其中显示的细胞看起来完全相同。我在一个tableView和子类UiTableViewCell中创建了一个原型单元。现在,如果我想在不同的控制器中使用相同的单元格,我该如何使用它呢?

如果我只是在新控制器中导入该customCell文件并使用故事板中给出的相同标识符来解除它,它就无法工作。它说

  

断言失败 - [UITableView   _configureCellForDisplay:forIndexPath:]

     

由于未捕获的异常而终止应用   'NSInternalInconsistencyException',原因:'UITableView dataSource   必须从tableView:cellForRowAtIndexPath:'

返回一个单元格

所以,显然这意味着,细胞是零。那么如何从故事板中实例化相同的单元格呢?是否可以或者我是否必须为新表创建不同的customCell?

5 个答案:

答案 0 :(得分:28)

K ..我明白了。首先,

  

我不能在两个不同的tableview中使用一个原型单元格。但是我   可以在两个不同的tableview中使用相同的tableViewCell子类。

要实现它,只需从一个控制器复制原型单元并将其粘贴为另一个tableview的原型单元。粘贴的tableview类保持不变。只需更改reuseIdentifier即可。并使用它。

编辑: 如果您的单元格具有相当复杂的UI,那么单独为单元格创建单独的xib更有意义。然后以编程方式register the xib使用表格视图。这样,你只有一个单元格的副本,并且在ui发生变化时更好地维护它。

答案 1 :(得分:1)

您可以在不同的视图控制器中使用相同的原型单元,只需将​​其从您设计它的控制器的表视图中出列。

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let viewControllerInWhichCellWasDefined = tabBarController?.viewControllers?[0]   
  let cell = viewControllerInWhichCellWasDefined.tableView.dequeueReusableCell(withIdentifier: "identifier", for: indexPath)
  return cell
}

答案 2 :(得分:0)

如果您在XIB中创建自定义单元格,它应该可以正常工作。但是,我怀疑单元格identifier导致了问题。尝试更改每个表视图控制器的单元标识符。

如果不是,您可能想发布源代码

答案 3 :(得分:0)

是的。我们可以使用ViewControllerA的tableview的原型单元作为ViewControllerB的tableview。只需在ViewControllerB中实现以下代码

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let vc_array = self.navigationController?.viewControllers 
    let view_controller = vc_array![vc_array!.count - 2] as! ViewControllerA
    let cell = view_controller.tableView.dequeueReusableCell(withIdentifier: "ViewControllerA_ID", for: indexPath) as! ViewControllerA
    
    return cell
}

这里的ViewControllerA是ViewController,其中包含带有原型单元格的表格视图,我们在ViewControllerB的表格视图上使用同一单元格

答案 4 :(得分:-2)

我在不同的应用程序中使用了相同的UITableViewCell。只需将一个TableViewCell复制到另一个应用程序。这是两个应用程序具有相同的布局等。这些应用程序不属于同一工作区。设置工作很好,没有问题或错误..只是不知道这是不是很好的做法。