从子视图表视图控制器推送新的VC

时间:2020-07-30 20:08:31

标签: ios swift uitableview uistackview

我在父级View Controller中有一个已安排的子视图(一个表视图)。

让我们调用父VC CollectionViewController和子视图(表VC)ResultsTableViewController。

我已将表视图添加到我的stackview中(在CollectionViewController中),如下所示:

let hitsTableController = ResultsTableViewController()
 
stackView.addArrangedSubview(hitsTableController.tableView)

然后我在ResultsTableViewController(子视图)中实现didSelectRowAt:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
     let hit = hitsSource?.hit(atIndex: indexPath.row)
           
     print("The ID is " + hit?.id)
    
    
     let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemDetailViewController") as? ItemDetailViewController
        
      self.navigationController?.pushViewController(vc!, animated: true)
               }
    
}

我能够打印有关所选单元格的信息(在本例中为ID),但是我无法弄清楚在按下单元格时如何导航到“详细信息视图控制器”。

我没有运气尝试过这个

let vc = self.storyboard?.instantiateViewController(withIdentifier: "ItemDetailViewController") as? ItemDetailViewController
    
self.navigationController?.pushViewController(vc, animated: true)

代码运行,但是什么也没有发生。任何帮助将不胜感激。

解决方案

添加此

addChild(hitsTableController)
hitsTableController.didMove(toParent: self)

在此之前

stackView.addArrangedSubview(hitsTableController.tableView)

如下面的科学怪人所述,问题是ResultsTableViewController无法访问导航堆栈。这是因为我必须使其成为父VC CollectionViewController的子代。现在,我可以毫无问题地调用它了。

self.navigationController?.pushViewController(vc!, animated: true) 

2 个答案:

答案 0 :(得分:0)

在应用程序崩溃时尝试强制打开对象,然后向我们提供崩溃详细信息

let vc = self.storyboard!.instantiateViewController(withIdentifier: "ItemDetailViewController") as! ItemDetailViewController    
self.navigationController!.pushViewController(vc, animated: true)

答案 1 :(得分:0)

更新:通过添加的详细信息,很明显,问题是视图控制器未嵌入UINavigationController中。您会看到navigationController是可选的,并且仅当控制器嵌入在UINavigationController中时才会分配。试试这个:

let hitsTableController = UINavigationController(rootViewController: ResultsTableViewController())
stackView.addArrangedSubview(hitsTableController.tableView)

似乎故事板中没有ItemDetailViewController,或者您忘记了设置标识符,这在您的情况下似乎不太可能。因此,我得出结论ItemDetailViewController是通过编程创建的。因此,您应该使用空的初始化程序初始化ItemDetailViewController来显示它。

let vc = ItemDetailViewController()
self.navigationController?.pushViewController(vc, animated: true)