我有两个文件,其中一个变量设置为“点击按钮”。
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 中,是复制粘贴错误还是您在函数中声明了 menu
和 swipeNumber
?如果它们在很可能是错误位置的函数中,对于类成员,它们应该与您的函数处于同一级别,或者对于全局变量,它们应该在类声明之外。
我不确定我是否理解您要完成的任务,但是如果您希望文件 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/