它能做什么
问题:
我无法想出一种在两个视图控制器之间传递数据的方法.无法根据segue标识符传递数据,因为它是标签栏控制器
请帮忙!
H. *_*nar 23
如果需要在视图控制器之间传递数据,那么:
var secondTab = self.tabBarController?.viewControllers[1] as SecondViewController
secondTab.array = firstArray
Run Code Online (Sandbox Code Playgroud)
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)
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.
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中获取/设置变量.
归档时间: |
|
查看次数: |
18169 次 |
最近记录: |