Swift:具有全局变量的属性观察者

时间:2015-01-05 15:44:20

标签: ios variables swift properties appdelegate

我有两个文件,其中一个变量在点击按钮'时设置为'

class Home: UIViewController {

    var swipeNumber = 99

    @IBAction func pressedThreeSwipes(sender: AnyObject) {
        swipeNumber = 3
    }
}

然后在第二个文件(充当第二个视图)中,我有一个 didSet属性观察者检查变量{的变化{ {1}}

swipeNumber

但是,运行程序时, println行无法运行表示变量swipeNumber尚未更改

所以我认为这会对属性观察者中的func didMoveToView(view: UIView) { /* Setup your scene here */ var menu = Home() var swipeNumber: Int = 0 { didSet { println("\(menu.swipeNumber) should be three.") } } } 造成问题,但是如果删除它,我会收到关于没有初始化者的错误。

然而,在仔细检查之后,我意识到问题是什么(我认为)。由于didSet代码实际上并没有“做任何事情”,我知道它没有识别变量的变化。我认为这是因为点击了按钮并且在视图加载之前变量'已更改,即变量必须在第二个视图打开时更改。我认为问题是我将属性观察者放在哪里。也许我应该将它放在AppDelegate或其他地方,并将其链接到我的第二个视图?

非常感谢您给我的任何建议。

提前谢谢。

编辑1:按照@ utahwithak的建议,我将一个属性观察者放在AppDelegate文件中:

= 0

我还class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? var swipeNumber: Int = 0 { didSet { println("\(swipeNumber)") } } } 更改为appDelegate 。现在,当我按menu时,我收到消息'3'。但是,当我进入下一个视图并播放时,另一条消息告诉我swipeNumber = 0.我认为这与我的AppDelegate文件中属性观察者的第一行有关。谢谢。

1 个答案:

答案 0 :(得分:2)

在第一个文件中,它设置的是没有didSet的本地成员变量。这与第二个文件中的swipeNumber不同,并且设置不会在第二个文件中触发didSet。< / p>

在文件2中是复制粘贴错误还是您在函数内声明menuswipeNumber?如果它们位于非常可能是错误位置的函数中,则它们应该与函数的类成员相同,或者在全局变量的类声明之外。

我不确定我是否理解您要完成的任务,但如果您希望文件2了解文件1信息,则可以通过多种方式使用全局变量。例如,文件1调用didSet或通过NSNotification发布NSNotificationCenter

的代理人

编辑委托示例

在文件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)")
}