如何使用 segue 在 viewcontroller 和选项卡栏视图控制器之间传递数据?
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
}
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
}