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

时间:2018-03-30 05:05:13

标签: ios swift tableview

当我实现第一个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'

enter image description here

4 个答案:

答案 0 :(得分:3)

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

这是我实施的方式。

Controller embedded in tab bar, with two table views

代码

    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()
    }
}

输出

enter image description here

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

EG。 :我为2 tableview定义了numberOfRowsInSection

  - (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if(tableView == self.table1)
{
return self.menuTitles.count;
}
else
{
return ModelCollection.count;
}