我正在使用Tabbed-Application模板在Swift 2.0 xCode7中创建一个应用程序,每个屏幕都有一个单独的ViewController。我有一个结构来管理我想要被所有视图控制器访问的变量。我在第一个视图控制器中创建了struct的实例。我能够访问其他视图中的struct数据和方法,但是如果在一个视图中更新数据,它就不会改变所有...它就好像每个View Controller都在自己创建自己的实例一样。我不希望这样。我希望每个ViewController在结构中共享相同的更新数据。这是否意味着我应该创建一个Singleton模式?或者是其他东西?我对此很陌生,所以感谢您的耐心等待。
答案 0 :(得分:3)
我不确定您是如何访问该结构的,但可能只需要将struct
更改为class
,因为结构是值类型,因此如果您指定它或传递给方法它被复制,而类的实例将避免复制
答案 1 :(得分:1)
因为你没有给我任何代码,这只是我的猜测。
结构与类不同。前者存储值,后者存储引用。我们来看看这段代码:
var obj = SomethingCool()
obj.somethingCooler = 20
var obj2 = obj
obj2.somethingCooler = 10
如果SomethingCool
是结构,obj.somethingCooler
仍然是20但obj2.somethingCooler
将是10.另一方面,如果SomethingCool
是一个类,则obj.somethingCooler
1}}和obj2.somethingCooler
将是20。
这是因为第三行。第三行非常重要。如果SomethingCool
是结构,则obj
中存储的值将复制到obj2
。即将创建两组独立的值。如果它是一个类,obj
也将被obj2
引用。即仍然只有一个对象。
现在你知道了不同之处,我可以告诉你,你必须在视图控制器中做过第三行,不是吗?
要解决此问题,您可以从结构更改为类。或者你可以创建这样的东西:
public class SomeName {
static var myData: SomeTypeOfStruct {
return something
}
}
答案 2 :(得分:0)
如果你坚持将它保持为结构,你可以做一些快速实际帮助你的东西...... AppDelegate!
appdelegate.swift是任何应用程序的单个实例对象。因此,如果您想要保存需要在整个应用程序中访问或通过应用程序更新的值,您可能需要使用AppDelegate。
E.g。 在FirstViewController.swift中设置要在剩余屏幕上反映的AppDelegate变量:
(UIApplication.sharedApplication().delegate as! AppDelegate).commonVariableName = NewValueYouWant;
在SecondViewController.swift中,从AppDelegate
中获取该值var updatedValue = (UIApplication.sharedApplication().delegate as! AppDelegate).commonVariableName;
再次......正如@Sweeper所说,你总是可以切换到更可靠的类,并用来实现这样的目标。
答案 3 :(得分:0)
它的作用就好像每个View Controller都在创建自己的实例 它自己的。
所有这些都在Apple的Swift guide中解释:
的Structs:
struct Dog {
var name: String
}
var d1 = Dog(name: "Rover")
var d2 = d1
d2.name = "Sally"
print(d1.name)
print(d2.name)
--output:--
Rover
Sally
类:
class Cat {
var name: String = ""
}
var c1 = Cat()
c1.name = "Kitty"
var c2 = c1
c2.name = "Gerald"
print(c1.name)
print(c2.name)
--output:--
Gerald
Gerald
看到区别?