如何使用 segue 在 vi​​ewcontroller 和选项卡栏视图控制器之间传递数据?

How to pass data between view controller and the tab-bar's view controllers using segue?

enter image description here

我还添加了设计的屏幕截图。

我有一个 viewcontrollerA 和一个带有 2 个视图控制器 B、C 的标签栏。

我想通过标签栏从 VcA -> VcB 传递 data 变量的数据。

我已将 segue 从 submitbutton 拖到 TabBar

我尝试用 segue 传递数据

所以,请帮我解决这个问题。

//In  View controller A
class ViewControllerA : UIViewController{
var data : String = ""
    @IBAction func submitButtonTapped(_ sender: Any) {   
    performSegue(withIdentifier: "homePage", sender: nil)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let vc = self.tabBarController!.viewControllers![0] as! ViewControllerB

     vc.containsData = data

    }

}
//In Tabbar View controller B
class ViewControllerB: UIViewController {
    var containsData : String = ""
    override func viewDidLoad() {
        super.viewDidLoad()
    print(containsData)

    }
}

在标签栏的 viewcontrollerB 中,我刚刚在 viewDidLoad()

中打印了变量 "data"

查看代码,我发现了问题所在。

首先,您需要使用 prepare(for segue 方法在使用 segue 呈现 viewControllerb 时传递数据。因此,在您的 ViewController 中,添加此方法并为 ViewControllerb 设置数据,如下所示,

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if let tabController = segue.destination as? UITabBarController {
        let bController = tabController.children.first(where: { [=10=] is ViewControllerb })
        (bController as? ViewControllerb)?.containsData = self.stringTF.text!
    }
    super.prepare(for: segue, sender: sender)
}

其次,从 ViewController 中删除方法 submitButtonTapped,因为您正在使用 segue 呈现 ViewControllerb,所以这不是必需的。还可以通过单击下图所示的十字删除情节提要中的此方法插座

如果您正在传递数据 viewController -> 使用 NavigationController 的 Tabcontroller。请尝试在 button/ tableviewCell/ collectionViewCell Click/ Press

上吹代码
let navController = self.Your_TABBAR_CONTROLLER.viewControllers![Tab_Index] as! UINavigationController
let vc = navController.topViewController as! Your_View_Controller
vc.name = Data

let navController = self.tabBarController.viewControllers![1] as! UINavigationController
let vc = navController.topViewController as! HomeViewController
vc.name= self.name

我得到答案

    @IBAction func submitButonTapped(_ sender: Any) {
            performSegue(withIdentifier: "homePage", sender: self)
    }
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        let barViewControllers = segue.destination as! UITabBarController
        let destinationViewController = barViewControllers.viewControllers![0] as! ViewControllerB
        destinationViewController.containsData = Data
    }