[英]Swift: Property observer with a global variable
我有两个文件 ,在其中一个文件中,将变量设置为“ 单击按钮时 ”。
class Home: UIViewController {
var swipeNumber = 99
@IBAction func pressedThreeSwipes(sender: AnyObject) {
swipeNumber = 3
}
}
然后在第二个文件( 用作第二个视图 )中,我有一个didSet属性观察器 ,它正在检查变量swipeNumber
的更改 。
func didMoveToView(view: UIView) {
/* Setup your scene here */
var menu = Home()
var swipeNumber: Int = 0 {
didSet {
println("\(menu.swipeNumber) should be three.")
}
}
}
但是, 当您运行该程序时 , println行不会运行 , 这表明变量swipeNumber尚未更改 。
因此,我认为这将是属性观察器中= 0
的问题,但是如果删除它,则会收到有关没有初始化程序的错误。
但是, 经过仔细检查 ,我意识到了问题所在。 由于didSet代码实际上并未“执行任何操作”,因此我知道它无法识别变量中的更改 。 我认为这是因为在视图加载之前单击了按钮并且变量“已更改” ,即必须在打开第二个视图的情况下更改变量 。 我认为问题出在我要安置财产观察员的地方 。 也许我应该将其放在AppDelegate或其他地方,并将其链接到第二个视图?
您能给我的任何建议将不胜感激。
先感谢您。
编辑1:按照@utahwithak的建议,我在AppDelegate文件中放置了一个属性观察器:
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var swipeNumber: Int = 0 {
didSet {
println("\(swipeNumber)")
}
}
}
我也将menu
更改为appDelegate 。 现在,当我按下pressedThreeSwipes
时,我收到消息“ 3”。 但是,当我转到下一个视图并播放时,另一条消息告诉我swipeNumber =0。我认为这与AppDelegate文件中属性观察器的第一行有关 。 谢谢。
在第一个文件中,它设置了没有didSet
的本地成员变量,这与第二个文件中的swipeNumber
不同,并且设置为不会触发第二个文件中的didSet。
在文件2中是复制粘贴错误,还是在函数中声明了menu
和swipeNumber
? 如果它们在函数中很可能是错误的位置,则对于类成员,它们应该与函数处于同一级别;对于全局变量,它们应位于类声明的外部。
我不确定我了解您要完成的工作,但是如果您希望文件2知道文件1的信息,则有许多方法可以不使用全局变量。 例如文件1调用didSet
或通过NSNotificationCenter
发布NSNotification
的委托
编辑代表示例
在文件1中,您可以在类声明之外添加类似的内容
protocol SwipeNumberDelegate{
func swipeNumberChanged(newVal:Int)
}
那么在您的文件1类内部将有这样的内容
class Home: UIViewController {
var swipeDelegate:SwipeNumberDelegate? = nil
var swipeNumber = 99{
didSet{
if let delegate = self.swipeDelegate{
delegate.swipeNumberChanged(self.swipeNumber)
}
}
}
...
}
从文件1或文件2以某种方式必须设置swipeDelegate
在类声明的文件2中,您必须通过使其看起来像这样来使其符合协议:
class mySecondClass:SuperClass, SwipeNumberDelegate
并实施协议
func swipeNumberchanged(newVal:Int){
println("Number Changed:\(newVal)")
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.