将数据从标签栏开关直接传递到另一个视图控制器

Posted

技术标签:

【中文标题】将数据从标签栏开关直接传递到另一个视图控制器【英文标题】:Passing data from a tab bar switch right into another view controller 【发布时间】:2017-06-28 17:47:29 【问题描述】:

这个问题可能听起来很复杂,所以让我缓解一下压力*

假设我有 2 个标签栏标签(Home1、Home2)

两者(Home1、Home2)都有导航控制器,每个控制器都有两个视图控制器

Home1(导航控制器 -> VC11 -> VC12)

Home2(导航控制器 -> VC21 -> VC22)

简单吧?嗯,不完全

我想做的是从 [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 小时

【问题讨论】:

【参考方案1】:

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

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。因此,如果您通过故事板 segue 将它们连接到 VC22,只需像这样调用它

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

【讨论】:

我认为它不起作用,因为接收到的数据永远不会被断点调用 @24hrcoder 正如我所说,您需要确保目标视图控制器有效。如果它尚未启动或已经从您的导航控制器中弹出,这将不起作用。即使目标视图控制器未初始化,您是否要传递数据? 是的,即使它没有启动。那我该怎么办呢? @24hrcoder 在我更新我的答案之前的最后一个问题。当从源视图控制器触发传递数据事件时,您是否希望应用弹出源视图控制器、切换选项卡、填充目标视图控制器以传递数据?或者您只是希望这些数据在用户打开目标视图控制器时可用? 我会喜欢它来弹出源视图、切换选项卡并填充我的目标视图控制器。谢谢【参考方案2】:

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

【讨论】:

感谢您尝试帮助 Jerland2,但它可能比单身先生更深入一些 @24hrcoder 我提出的解决方案不涉及单例。我的解决方案是我在几乎相同的问题上多次使用的解决方案,但没有使用单例【参考方案3】:

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

    存储您的数据的单例,您将其从一个 VC 传递到另一个,以便如果 VC12 将数据存储在单例中,则 VC22 可以访问它很容易,因为它也可以访问单例。

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

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

    使用完整的数据持久层,例如使用 SQLite、Core Data 或 Realm 来存储和检索数据。

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

【讨论】:

谢谢 Guillermo 的回复,但我可能有事找方先生

以上是关于将数据从标签栏开关直接传递到另一个视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

将数据从标签栏控制器传递到 swift 和 xcode 中的视图控制器

如何将数据从视图控制器传递到标签栏控制器以及导航控制器?

在 UITabBarController 中,如何从一个视图控制器切换到另一个视图控制器并保留标签栏?

如何从标签栏视图控制器切换到另一个作为导航控制器子视图的视图

是否可以从标签栏控制器导航到另一个标签栏控制器?

切换到另一个视图控制器时,如何保持标签栏可见? [关闭]