swift NSTimer userinfo

时间:2015-03-19 08:48:41

标签: swift nstimer userinfo

我试图通过NSTimer的用户信息传递UIButton。我已经阅读了NSTimers上有关stackoverflow的每篇文章。我变得非常接近但却无法到达那里。这篇文章有帮助

  

Swift NSTimer retrieving userInfo as CGPoint

func timeToRun(ButonToEnable:UIButton) {
    var  tempButton = ButonToEnable
    timer = NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setRotateToFalse"), userInfo: ["theButton" :tempButton], repeats: false)    
}

计时器运行的功能

func setRotateToFalse() {
    println(  timer.userInfo )// just see whats happening

    rotate = false
    let userInfo = timer.userInfo as Dictionary<String, AnyObject>
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton)
    tempbutton.enabled = true
    timer.invalidate()    
}

3 个答案:

答案 0 :(得分:28)

我意识到你已经成功解决了这个问题,但我想我会再给你一些关于使用NSTimer的信息。访问计时器对象以及用户信息的正确方法是使用它,如下所示。初始化计时器时,您可以像这样创建它:

Swift 2.x

NSTimer.scheduledTimerWithTimeInterval(4, target: self, selector: Selector("setRotateToFalse:"), userInfo: ["theButton" :tempButton], repeats: false)

Swift 3.x&lt;

Timer.scheduledTimer(timeInterval: 1, target: self, selector:#selector(ViewController.setRotateToFalse), userInfo: ["theButton" :tempButton], repeats: false)

然后回调看起来像这样:

func setRotateToFalse(timer:NSTimer) {
    rotate = false
    let userInfo = timer.userInfo as Dictionary<String, AnyObject>
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton)
    tempbutton.enabled = true
    timer.invalidate()    
}

因此,您不需要保留对计时器的引用,并尽可能避免使用令人讨厌的全局变量。如果你的类没有从NSObject继承,那么你可能会在swift中遇到问题,因为它没有定义回调,但可以通过在函数定义的开头添加@objc来轻松修复。

答案 1 :(得分:1)

在我发布之前,我正在阅读这篇文章。我注意到我在userinfo之前有timer.invalidate(),这就是为什么它没有工作。我会发布它,因为它可能会帮助其他人。

func setRotateToFalse(timer:NSTimer) {
    rotate = false
    timer.invalidate()
    let userInfo = timer.userInfo as Dictionary<String, AnyObject>
    var tempbutton:UIButton = (userInfo["theButton"] as UIButton)
    tempbutton.enabled = true
}

答案 2 :(得分:1)

macOS 10.12+和iOS 10.0+引入了基于块的Timer API,这是一种更方便的方式

func timeToRun(buttonToEnable: UIButton) {
    timer = Timer.scheduledTimer(withTimeInterval:4, repeats: false) { timer in 
        buttonToEnable.enabled = true
    }    
}

单击计时器在发生后会自动失效。

单次计时器的类似便捷方式是使用GCD(DispatchQueue.main.asyncAfter

func timeToRun(buttonToEnable: UIButton) {
    DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4)) {
        buttonToEnable.enabled = true
    }
}