15

NSTimer のユーザー情報を使用して UIButton を渡そうとしています。NSTimers の stackoverflow に関するすべての投稿を読みました。かなり近づいているのですが、なかなかたどり着けません。この投稿は役に立ちました

userInfoをCGPointとして取得するSwift NSTimer

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

3 に答える 3

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

したがって、タイマーへの参照を保持する必要はなく、可能であれば厄介なグローバル変数を避ける必要があります。クラスがコールバックが定義されていないという場所から継承しない場合、swift で問題が発生する可能性がありますが、これは関数定義の先頭にNSObject追加することで簡単に修正できます。@objc

于 2015-03-20T19:14:26.080 に答える
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
}
于 2015-03-19T08:48:40.600 に答える