我有两个文件,其中一个变量在点击按钮'时设置为'。
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文件中属性观察者的第一行有关。谢谢。
答案 0 :(得分:2)
在第一个文件中,它设置的是没有didSet
的本地成员变量。这与第二个文件中的swipeNumber
不同,并且设置不会在第二个文件中触发didSet。< / p>
在文件2中是复制粘贴错误还是您在函数内声明menu
和swipeNumber
?如果它们位于非常可能是错误位置的函数中,则它们应该与函数的类成员相同,或者在全局变量的类声明之外。
我不确定我是否理解您要完成的任务,但如果您希望文件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)")
}