在下面的照片中,我向您展示了我的故事板。在TableView控制器上,我有可扩展的菜单。我现在无法实现的是打开第二个标签栏项目(绿色标签)并让它知道所选菜单项目的ID是什么。在标签栏控制器和绿色和蓝色控制器之间,我有关系“视图控制器”。我尝试使用以下代码直接调用绿色视图控制器:
let secondTab = self.storyboard?.instantiateViewController(withIdentifier: "secondstoryboardid") as! SecondVC
self.present(plavi, animated: true, completion: nil)
此代码显示第二个选项卡视图,但没有标签栏和从容器视图派生的所有内容。
如果你正确配置了这样的故事板,你应该通过UITabBarController
获得对prepare(segue)
的引用,这样做:
private weak var tabBarViewController:UITabBarController?
// be sure to add prepare inside your segue manager (the container in this case)
override public func prepare(for segue: UIStoryboardSegue, sender: Any?) {
self.tabBarViewController = segue.destination as? UITabBarController
}
此外,您可能希望声明枚举以便对嵌入式视图控制器进行干净访问:
enum TabType:Int {
case blue
case green
}
因此,您可以定义一个用于注入所选indexPath的函数,执行以下操作:
func inject(indexPath:IndexPath, into tab:TabType) {
if let greenVc = tabBarViewController?.viewControllers?[tab.rawValue] as? GreenViewController {
greenVc.selectedIndexPath = indexPath
tabBarViewController?.selectedIndex = tab.rawValue // this will auto select the TabType viewcontroller
}
}
最后,每当你必须更改当前选择时,可以使用新的indexPath调用inject:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.inject(indexPath: indexPath, into: .green)
}
注意
调用instantiateViewController
意味着制作一个新的“假”视图控制器,这是一种错误的方法,因为你已经将它嵌入你的UITabBarController.viewControllers