我在两个不同的控制器中有两个不同的tableviews。但我需要在其中显示的细胞看起来完全相同。我在一个tableView和子类UiTableViewCell中创建了一个原型单元。现在,如果我想在不同的控制器中使用相同的单元格,我该如何使用它呢?
如果我只是在新控制器中导入该customCell文件并使用故事板中给出的相同标识符来解除它,它就无法工作。它说
断言失败 - [UITableView _configureCellForDisplay:forIndexPath:]
由于未捕获的异常而终止应用 'NSInternalInconsistencyException',原因:'UITableView dataSource 必须从tableView:cellForRowAtIndexPath:'
返回一个单元格
所以,显然这意味着,细胞是零。那么如何从故事板中实例化相同的单元格呢?是否可以或者我是否必须为新表创建不同的customCell?
答案 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复制到另一个应用程序。这是两个应用程序具有相同的布局等。这些应用程序不属于同一工作区。设置工作很好,没有问题或错误..只是不知道这是不是很好的做法。