ios - Swift:具有全局变量的属性观察器

标签 ios variables swift properties appdelegate

我有两个文件,其中一个变量设置为“点击按钮”。

class Home: UIViewController {

    var swipeNumber = 99

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

然后在第二个文件(充当第二个 View )中,我有一个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 代码实际上并没有“做任何事情”,我知道它没有识别变量的变化。我认为这是因为在 View 加载之前单击了按钮并且变量“已更改”,即必须在打开第二个 View 时更改变量。我认为问题在于我将属性观察器放在哪里。也许我应该把它放在 AppDelegate 或其他地方,并将其链接到我的第二个 View ?

如果您能给我任何建议,我们将不胜感激。

提前谢谢你。

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

class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    var swipeNumber: Int = 0 {
        didSet {
            println("\(swipeNumber)")
        }
    }
}

我还menu 更改为appDelegate。现在,当我按下 pressedThreeSwipes 时,我收到消息“3”。但是,当我转到下一个 View 并播放时,一条不同的消息告诉我 swipeNumber = 0。我认为这与 AppDelegate 文件中属性观察器的第一行有关。谢谢。

最佳答案

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

在文件 2 中,是复制粘贴错误还是您在函数中声明了 menuswipeNumber?如果它们在很可能是错误位置的函数中,对于类成员,它们应该与您的函数处于同一级别,或者对于全局变量,它们应该在类声明之外。

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

发布 NSNotification 的委托(delegate)

为委托(delegate)示例编辑

在文件 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 中,您必须通过使其看起来像这样来说明它符合协议(protocol):

class mySecondClass:SuperClass, SwipeNumberDelegate

并实现协议(protocol)

func swipeNumberchanged(newVal:Int){
    println("Number Changed:\(newVal)")
}

关于ios - Swift:具有全局变量的属性观察器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27782891/

相关文章:

ios - 方法 'application:openURL:options:'未被调用

ios - UIAlertController 的后续演示出现卡顿

ios - TableView 中的单元格和行有什么区别?

iOS 核心蓝牙 : Getting API MISUSE Warning

ios - 如何在 ios 的 xmpp 框架中检查收到的消息是已读还是未读

删除设备后 Xamarin (VS) 中缺少 iOS 模拟器

php - $_POST 到 PHP 页面

c++ - 这个局部变量的声明实际上会重复很多次吗?

html - 直接向 URL 提交表单值?

arrays - 将简单代码集成到复杂代码中