2014-12-25 167 views
11

它所做的在标签查看控制器之间传递数据在swift?

  1. 当我的标签栏控制器负载的第一页,我检索阵列中的一个JSON文件
  2. 我保存它的数据(在第一个视图控制器)
  3. 获得的数据将显示在第二个视图控制器中。数据已经加载并存储在第一个视图控制器的数组中。

问题:

我不能找出一个的方式来传递这两个视图控制器之间的数据。由于它是一个标签栏控制器,因此无法传递基于segue标识符的数据。

请帮忙!

+0

[例使用unwind segue](https://stackoverflow.com/a/47751962/3681880)。如果您从一个选项卡的后代导航到另一个选项卡的根目录,这仅仅是有用的。 – Suragch

回答

16

您可以将数据存储在AppDelegate上。从多个视图控制器访问会很容易。 但是,如果你需要通过视图控制器之间的数据则:

var secondTab = self.tabBarController?.viewControllers[1] as SecondViewController 
secondTab.array = firstArray 
+0

它说[AnyObject]没有一个名为下标 – 0to1000

+0

的成员它在哪里说的?你能发布你的代码吗? –

0

我在我的应用程序标签视图控制器和我在多个选项卡视图相同的阵列。我通过将数组声明为任何类之外的数组(在导入UIKit和类声明之间的行中)来实现此目的,以便它基本上是每个视图都可以访问的全局变量。你试过这个吗?

+0

你是如何从其他课程访问的? – 0to1000

+0

我只是把它叫做我已经声明的任何其他变量。 –

+0

为什么这个答案没有大拇指?这是不好的做法,因为它似乎是最好/最简单的解决方案吗? – bakalolo

10

H. Serdar的代码示例是正确的,这是访问另一个选项卡的视图控制器并为其提供数据的方式。

请记住,当您在Swift中传递数组时,you're passing it by value与Objective-C不同,后者通过引用传递它。这意味着由第二个视图控制器所做的更改不会反映在您的第一个视图控制器中,因为您的第二个视图控制器正在使用数组的副本,而不是同一个数组。如果您希望这两个视图控制器都修改相同的数组,请将该数组放在一个类中,然后传递该类的单个实例。

其他一些注意事项: 你可以继承的TabBarController给它那将存储数据的属性,这将使用可用于所有选项卡:

if let tbc = tabBarController as? YourCustomTabBarSubclass { 
    println("here's my data \(tbc.array)") 
} 

在这种情况下,你会从多个选项卡访问相同的数组,所以一个选项卡中的更改将反映在其他地方。

我建议不要将您的App Delegate用作集中存储数据的方法。这不是应用程序委托的目的。其目的是处理应用程序对象的委托调用。

视图控制器应该拥有所有需要完成工作的数据。它们与模型数据(例如数组或数据库引用或托管对象上下文)有连接关系,而不是通过遍历视图控制器图或者进入委托或者甚至将视图控制器伸出到另一个对象使用全局变量。 View Controller的这种模块化自包含结构允许您在不同设备上重构类似但独特设计的应用,例如在一个设备(如iPad)的弹出窗口中呈现视图控制器,并将其全屏显示在另一设备上,例如一个iPhone。

3

SWIFT 3

在第一个的ViewController,声明你的变量(在你的情况下数组)像通常那样。

在你的第二个视图控制器,这样做:

var yourVariable: YourVariableClass { 
    get { 
     return (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable 
    } 
    set { 
     (self.tabBarController!.viewControllers![0] as! FirstViewControllerClass).yourVariable = newValue 
    } 
} 

这样做是因为,在tabbarcontroller标签项后面的所有viewcontrollers被初始化。通过在第二个视图控制器中执行此操作,您实际上是从第一个视图控制器中/从/设置变量。

+0

这应该是正确的答案! –

6

我最终在上面的回答中使用了Woodster的建议。

在斯威夫特3

创建一个新的快捷文件,并创建一个类:

class Items { 
    static let sharedInstance = Items() 
    var array = [String]() 
} 

在任何您的视图控制器,你可以访问阵列,像这样:

Items.sharedInstance.array.append("New String") 
print(Items.sharedInstance.array) 
+2

发现这个问题后,讨论了1/2次 - 在堆栈和其他地方讨论,以及为解决问题的方法提供了许多不同的答案 - **这是问题/要求的最清晰和简洁的答案/解决方案** 。这是一个很好的清洁架构,与模型视图展示器等设计模式一致。如果我能够在人们询问如何做到这一点时帮助专注交通,我想要5次投票答复。非常感谢分享对我来说像最佳做法..又名,正确的方法 - 解决这个要求 – gnB

+0

我很高兴我可以帮助:)更多信息在这里。 https://krakendev.io/blog/the-right-way-to-write-a-singleton – Jeff

+0

更新:使用单身人士有很多争议。被告知。 – Jeff

相关问题