如何在 Tabbar 上的 Single viewController 中使用两个 tableView

Posted

技术标签:

【中文标题】如何在 Tabbar 上的 Single viewController 中使用两个 tableView【英文标题】:How to use two tableView in Single viewController on Tabbar 【发布时间】:2018-03-30 05:05:13 【问题描述】:

然而,当我实现第一个 tableView 并且它工作正常时,我尝试在 Tabbar 上的同一个 viewController 上实现另一个 tableView,然后发生崩溃。

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'unable to dequeue a cell with identifier Cell - must register a nib or a class for the identifier or connect a prototype cell in a storyboard'

【问题讨论】:

你能告诉你的代码你试过@ios @DilipTiwari,我什么都没做,我只是将第二个 tableView 添加到标签栏下的 ViewController 并运行应用程序。 当我在标签栏下使用单个 tableView 时它正在工作 ***.com/questions/23526756/… 或者请分享演示代码 显示您的故事板的屏幕截图,其中选择了两个表,并且属性检查器必须在其中可见。我认为您缺少单元格标识符。另一件事是使用单元格并错过了向表格视图注册单元格类。 【参考方案1】:

当您将两个表视图放在同一个控制器中时,两个表视图的委托/数据源将连接到同一个控制器。您将必须确定必须更新哪个表视图。您可以通过获取两个表视图的出口,然后在 cellForRowAt 中应用一个简单的条件构造来做到这一点。

这就是我的实现方式。

代码

    extension ViewController: UITableViewDelegate, UITableViewDataSource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return 3
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        if tableView == firstTableView
        
            if let cell = tableView.dequeueReusableCell(withIdentifier: "prototypeOne", for: indexPath) as? UITableViewCell
            
                cell.textLabel?.text = "First table view. Row \(indexPath.row)"
                return cell
            
            else
            
                let cell = UITableViewCell.init(style: .default, reuseIdentifier: "prototypeOne")
                cell.textLabel?.text = "First table view. Row \(indexPath.row)"
                return cell
            
        
        else if tableView == secondTableView
        
            if let cell = tableView.dequeueReusableCell(withIdentifier: "prototypeTwo", for: indexPath) as? UITableViewCell
            
                cell.textLabel?.text = "Second table view. Row \(indexPath.row)"
                return cell
            
            else
            
                let cell = UITableViewCell.init(style: .default, reuseIdentifier: "prototypeTwo")
                cell.textLabel?.text = "Second table view. Row \(indexPath.row)"
                return cell
            
        
        return UITableViewCell()
    

输出

【讨论】:

【参考方案2】:

在 Storyboard 中选择您的原型单元格,并在右侧的 Inspectors 中将标识符设置为 Cell。 请注意,此标识符与单元类不同。

【讨论】:

请注意我使用的是 Tabbar 这无关紧要。您的具体错误表明您正在尝试将具有标识符“Cell”的单元格出列,但该标识符未定义给任何单元格。如果您将该标识符添加到单元格中,您的错误应该会消失。 如果您使用两个表视图,请向它们添加出口并使用if 语句与 tableView 参数进行比较。据此,使用一个或另一个标识符出队。也许您只在一个 tableView 上定义了标识符,而在另一个上出列时会产生错误。【参考方案3】:

在第二个uitableview中注册相同的uitableviewcell。

【讨论】:

【参考方案4】:

将您的两个表与 tableview 对象进行比较:

创建两个表的 IBOutlet 假设 table1 和 table2 然后在 tableview 的任何委托/数据源方法中比较 tableview 并执行代码

例如。 :我已经为 2 个 tableview 定义 numberOfRowsInSection

  - (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
if(tableView == self.table1)

return self.menuTitles.count;

else

return ModelCollection.count;

【讨论】:

以上是关于如何在 Tabbar 上的 Single viewController 中使用两个 tableView的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 7.1 中更改 TabBar 上的图像和标签颜色?

tabBar.topAnchor 的奇怪布局

ios开发为啥iphone x push的时候tabbar显示有问题

无法在 View Controller iOS Swift 中显示 TabBar

如何修改tabBar的高度

小程序 tabbar