2015-03-19 41 views
10

我想通過與NSTimer的用戶信息UIButton。我已經閱讀了NSTimers上的每一篇關於stackoverflow的文章。我越來越近,但不能完全到達那裏。這篇文章已經幫助迅速NSTimer用戶信息

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

回答

24

我知道你已經設法解決這個問題,但我想我會給大家介紹使用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繼承,那麼您可能會遇到問題,因爲它沒有定義回調,但可以通過在函數定義的開始處添加@objc來輕鬆解決。

+0

感謝你好這是非常有益的 – user2164327 2015-03-22 10:22:14

+0

沒問題。當你有一刻時,你能標記一個答案嗎?乾杯 – 2015-03-22 17:03:18

+1

此外,您不必絕對必須將字典作爲'userInfo'傳遞,您只需要一個符合「AnyObject?」的對象。就我個人而言,我用它來傳遞'String' – tfrank377 2016-02-24 17:56:04

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

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