swift NSTimer 用户信息

问题描述 投票:0回答:4

我正在尝试传递带有 NSTimer 的用户信息的 UIButton。我读过 NSTimers 上 stackoverflow 上的每一篇文章。我已经非常接近了,但还不能完全到达那里。这篇文章有帮助

Swift NSTimer 将用户信息检索为 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()    
}
swift nstimer userinfo
4个回答
32
投票

我意识到您已经设法解决了这个问题,但我想我应该为您提供更多有关使用

NSTimer
的信息。访问计时器对象和用户信息的正确方法是像下面这样使用它。初始化计时器时,您可以这样创建它:

斯威夫特 2.x

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

斯威夫特 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()    
}

因此,您不需要保留对计时器的引用,并尽可能避免使用讨厌的全局变量。如果你的类不是从

NSObject
继承的,那么你可能会在 swift 中遇到问题,它表示没有定义回调,但这可以通过在函数定义的开头添加
@objc
来轻松解决。


2
投票

macOS 10.12+ 和 iOS 10.0+ 引入了基于块的 API

Timer
,这是一种更方便的方式

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

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
}

0
投票

我就是这样做的

var timer: Timer?

func startTimer(with user: User) {

    var dict = Dictionary<String, Any>()
    dict.updateValue(user, forKey: "userObject")

    timer?.invalidate()
    timer = nil

    timer = Timer.scheduledTimer(timeInterval: 7,
                                     target: self,
                                     selector: #selector(getDataFromUserObject(_:)),
                                     userInfo: dict,
                                     repeats: false)

}

@objc func getDataFromUserObject(_ timer: Timer) {

    guard let userInfo = timer.userInfo as? Dictionary<String, Any> else { return }
    guard let user = userInfo["userObject"] as? User else { return }

    let username = user.username
}

用户:

struct User {
    username: String?
}
© www.soinside.com 2019 - 2024. All rights reserved.