swift NSTimer 用户信息

swift NSTimer userinfo

我正在尝试传递带有 NSTimer 用户信息的 UIButton。我已经阅读了 NSTimers 上关于 Whosebug 的所有 post。我已经很接近了,但还不能完全到达那里。这 post 帮助了

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()    
}

我正打算 post 在 post 编辑之前阅读它。我注意到我在 userinfo 之前有 timer.invalidate(),所以这就是它不起作用的原因。我会 post 因为它可能对其他人有帮助。

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
}

我知道你已经设法解决了这个问题,但我想我会给你更多关于使用 NSTimer 的信息。访问定时器对象和用户信息的正确方法是像下面这样使用它。初始化计时器时,您可以这样创建它:

Swift 2.x

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

Swift 3.x<

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()    
}

因此,您不需要保留对计时器的引用,并尽可能避免经常使用讨厌的全局变量。如果你的 class 不是从 NSObject 继承的,你可能 运行 在 swift 中遇到问题,它说没有定义回调,但这可以通过添加 @objc 在函数定义的开头。

macOS 10.12+和iOS10.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
    }
}