将数据传递给Tab Bar Item(ViewController)

时间:2018-01-24 00:43:57

标签: ios swift uitableview uitabbarcontroller

在下面的照片中,我向您展示了我的故事板。在TableView控制器上,我有可扩展的菜单。我现在无法实现的是打开第二个标签栏项目(绿色标签)并让它知道所选菜单项目的ID是什么。在标签栏控制器和绿色和蓝色控制器之间我有关系"查看控制器"。我尝试使用以下代码直接调用绿色视图控制器:

let secondTab = self.storyboard?.instantiateViewController(withIdentifier: "secondstoryboardid") as! SecondVC

self.present(plavi, animated: true, completion: nil)

此代码显示第二个标签视图,但没有标签栏和从容器视图派生的所有内容。

My storyboard

1 个答案:

答案 0 :(得分:2)

如果你正确配置了这样的故事板,你应该得到UITabBarControllerprepare(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