在快速浏览器中查看控制器之间传递数据?

0to*_*000 19 swift

它能做什么

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

问题:

我无法想出一种在两个视图控制器之间传递数据的方法.无法根据segue标识符传递数据,因为它是标签栏控制器

请帮忙!

H. *_*nar 23

如果需要在视图控制器之间传递数据,那么:

var secondTab = self.tabBarController?.viewControllers[1] as SecondViewController
secondTab.array = firstArray 
Run Code Online (Sandbox Code Playgroud)

  • 如果有超过 2 个选项卡怎么办? (2认同)
  • @DaniSpringer 这是一种非常古老的处理方式。最好用依赖注入和演示者来处理你的代码。当然,如果你想额外使用它: varthirdTab = self.tabBarController?.viewControllers[2] as ThirdViewControllerthirdTab.array = firstArray viewControllers[] 数组将所有的 viewController 信息存储在其中,以便您可以从 tabController 内部访问 (2认同)

Jef*_*eff 16

我最后使用了一个单身人士,就像伍德斯特在上面的回答中所说的那样.

在Swift 3中

创建一个新的swift文件并创建一个类:

class Items {
    static let sharedInstance = Items()
    var array = [String]() 
}
Run Code Online (Sandbox Code Playgroud)

在任何视图控制器中,您都可以像这样访问您的数组:

Items.sharedInstance.array.append("New String")
print(Items.sharedInstance.array)
Run Code Online (Sandbox Code Playgroud)

  • 我不认为这会引入“良好的干净架构”。共享可在代码库中的任何点访问的全局状态对我来说听起来像是一场潜在的灾难。甚至链接帖子(https://krakendev.io/blog/the-right-way-to-write-a-singleton)的作者也表示“将这篇文章视为不是我认可使用单身人士也很重要共享状态”。 (4认同)
  • 在发现这个问题之后,就像在堆栈和其他地方讨论的那样,并且有很多不同的答案来解决它 - **这是对问题/要求**的最清晰简洁的答案/解决方案.这是一个很好的干净架构,与Model View Presenter等设计模式一致.如果我能够在人们询问如何做到这一点时帮助集中交通,我想对该答案进行5次投票.非常感谢您分享对我来说最好的做法...也就是说,正确的方法 - 解决这个要求 (2认同)

Woo*_*ter 10

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

请记住,当您在Swift中传递数组时,您将按值传递它,而不像Objective-C那样通过引用传递它.这意味着第二个视图控制器所做的更改不会反映在第一个视图控制器中,因为第二个视图控制器正在使用数组的副本,而不是相同的数组.如果您希望两个视图控制器都修改同一个数组,请将该数组放入一个类中,并传递该类的单个实例.

其他一些注意事项:您可以将TabBarController子类化为它提供一个存储数据的属性,并且所有选项卡都可以使用以下内容:

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

在这种情况下,您将从多个选项卡访问相同的阵列,因此一个选项卡中的更改将反映在其他位置.

我建议不要将App Delegate用作存储数据的集中位置.这不是应用程序代表的目的.其目的是处理应用程序对象的委托调用.

视图控制器应该具有封装在其中的所有数据,以便他们完成工作.它们与模型数据(例如您的数组,或对数据库或托管对象上下文的引用)有关,而不是让视图控制器通过遍历视图控制器图形或进入代理甚至连接到另一个对象.使用全局变量.这种模块化,独立的视图控制器结构允许您在不同设备上重新构建您的应用程序以获得类似但独特的设计,例如在一个设备(如iPad)上的弹出窗口中呈现视图控制器并在另一个设备上呈现全屏幕,例如一部iPhone.


gui*_*ido 6

SWIFT 3

在你的第一个viewcontroller中,像往常一样声明你的变量(在你的情况下是一个数组).

在第二个viewcontroller中,执行以下操作:

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

这是有效的,因为在tabbarcontroller中,选项卡项后面的所有viewcontrollers都被初始化.通过在第二个viewcontroller中执行此操作,您实际上是从/在第一个viewcontroller中获取/设置变量.