【问题标题】: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 小时

【问题讨论】:

    标签: swift firebase uinavigationcontroller uitabbarcontroller uistoryboardsegue


    【解决方案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 之外,将这些数据存储在其他地方是有意义的。以下是一些选项:

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

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

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

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

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

    【讨论】:

    • 谢谢 Guillermo 的回复,但我可能有事找方先生
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多