swift NSTimer userinfo

use*_*327 12 nstimer userinfo swift

我正在尝试使用NSTimer的userinfo传递UIButton.我已经阅读了NSTimers上有关stackoverflow的每篇文章.我变得非常接近,但却无法到达那里.这篇文章有所帮助

Swift NSTimer将userInfo检索为CGPoint

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

计时器运行的功能

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()    
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*son 28

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

Swift 2.x

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

Swift 3.x <

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

然后回调看起来像这样:

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()    
}
Run Code Online (Sandbox Code Playgroud)

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

  • 另外,你不必将字典作为`userInfo`传递,你只需要一个符合`AnyObject?`的对象.就个人而言,我用它传递一个`String` (2认同)