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

问题描述 投票:1回答:1

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

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

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

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

My storyboard

ios swift uitableview uitabbarcontroller
1个回答
2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.