将数据从标签栏切换到另一个视图控制器

Passing data from a tab bar switch right into another view controller

这个问题可能听起来很复杂,所以让我减轻压力*

简单吧?好吧,不完全是

我想做的是将数据从[Home1: VC12 传到Home2: VC22]。

我的编码工作:

tabBarController!.selectedIndex = 1
self.navigationController!.popToViewController(navigationCon‌troller!.viewControl‌​lers[1] as! (Home2: VC22), animated: false)



let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
navController.popToViewController((Home2: VC22) as! UIViewController, animated: true)

for oneView in (self.navigationController?.viewControllers)! {
    if (oneView.isKind(of: (Home2: VC22).classForCoder())) {
      let friendView = oneView as! (Home2: VC22)
      friendView.testing = "Worked?"
    }
}

欢迎任何帮助!!总时数:8 小时

您的传递数据任务正在进行此过程

V12 --(pop)--> V11 --(switch)--> V21 --(push)--> V22

如果您选择传递数据,您将需要通过所有这三个事务来传递它,这需要大量的编码并且很难实践。

实现您的目标的更好方法是将数据存储在 V12 中,然后从 V22 加载它,而不是四处传递数据。所以现在你只需要担心如何将用户从V12转移到V22。

只需要两行代码就可以从UserDefaults

中存储和读取数据

在你的V12上,在你进行上述交易之前,先这样保存你的数据

UserDefaults.standard.set("yourStringData", forKey: "data")

然后当你从viewDidLoad到达VC22时,以这种方式读取存储的信息

UserDefaults.standard.string(forKey: "data")

对于您的视图事务部分,popToViewController 用于从子视图控制器到它的父视图控制器。因此,当您切换选项卡并获得 UINavigationController 时,topViewController 必须是 VC21。因此,如果您通过故事板转场将它们连接起来,则转到 VC22,只需这样称呼它

let navController = self.tabBarController?.viewControllers![1] as! UINavigationController
let VC21 = navController.topViewController!
VC21.performSegue(withIdentifier: "segue", sender: nil)

您还可以子类化您的标签栏并创建一个变量来存储您的数据。然后 VC 都可以访问数据。这种方式也减轻了对单例的可能需求。

听起来您需要重新考虑您的方法。这取决于您设置应用程序的方式,但除了直接将数据从一个 VC 传递到另一个之外,将这些数据存储在其他地方也是有意义的。以下是一些选项:

  1. 存储数据的单例,然后将其从一个 VC 传递到另一个 VC12 存储数据在单例中,然后 VC22 可以轻松访问它,因为它也可以访问单例。

  2. Container 视图控制器存储要在其子视图控制器之间共享的数据。因此,在此示例中,TabBarController 可以存储此数据。

  3. 使用 UserDefaults 作为穷人 Singleton/Persistence 解决方案。

  4. 使用 SQLite、Core Data 或 Realm 等完整的数据持久层来存储和检索数据。

...还有其他解决方案,但我认为根据您的需要,其中一种解决方案可以很好地满足您的需求。