2016-08-02 11 views
0

NSTimerで時間間隔を変更するにはどうすればよいですか?Swift NSTimer動的に間隔を変更する

var difficulty: Double = 1.0 

override func viewDidLoad() { 
    super.viewDidLoad() 

    _ = NSTimer.scheduledTimerWithTimeInterval(difficulty, target: self, selector: #selector(hideAllBtns), userInfo: nil, repeats: true) 

} 

私は、hideallbuttonsから毎回呼び出され、難易度を更新するswitch文を実行します。

func getDifficulty (score : Double) -> Double { 

    switch score { 

    case 0...100: return(1.0) 
    case 100...200: return (0.8) 
    case 200...300: return (0.5) 
    case 300...400: return (0.2) 
    default: return (1.0) 

    } 
} 

しかしNSTimerは、私はそれがその値に最初の実行とスティックの際にコピーを作成すると推定1.0秒で発射し続け、私はタイマーコールで変数を作成しようとしましたが、それは動作しません。

タイマーが起動する速度を動的に調整する簡単な方法はありますか?

これは私がまだ学んでいる練習プロジェクトなので、私がやろうとしていることを構造化するための方がはるかに良い方法があると理解しています。私は動的に調整するタイマーが将来の使用に役立つと思います。

+0

あなた 'NSTimer'を繰り返すように設定されている:真。だから1秒だけ繰り返すでしょう。難易度と繰り返しに基づいて期間を設定する必要があります:false。メソッドを呼び出してタイマーを開始し、 'hideAllBtns'メソッドで難易度に基づいてタイマーをリセット(つまり開始)する必要があります。また、https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Properties.html#//apple_ref/doc/uid/TP40014097-CH14-ID259でゲッターとセッターを作成する方法もご確認ください。 – Asdrubal

+0

"これは単なる練習プロジェクトです。"尋ねる前に検索を練習するチャンス。 – matt

答えて

2

タイマーを起動すると、タイマーを起動できません。

私はあなたが必要な正確に何を確認していないが、あなたは2つのオプションがあります。

  1. タイマーを無効にし、新たな時間間隔で新しいものを発射、あなたもクラスでタイマーを宣言することができ、かつ無効にした後で値をオーバーライドするだけです。

  2. 繰り返し値をfalseに設定し、毎回新しいタイマーを起動します。

この例を見てみましょう:それは作成されています一度

class ViewController: UIViewController { 
    var difficulty: Double = 1.0 
    var timer = NSTimer() 

    override func viewDidLoad() { 
     activateTimer() 
    } 

    func activateTimer(){ 
     NSTimer.scheduledTimerWithTimeInterval(difficulty, target: self, selector: Selector(self.timerMethod()), userInfo: nil, repeats: true) 
    } 

    func timerMethod() { 
     print("Timer method called") 
    } 

    func endTimer() { 
     timer.invalidate() 
    } 

    func increaseDifficulty() { 
     difficulty = 2.0 
     endTimer() 
     activateTimer() 
    } 

} 
0

あなたはNSTimerオブジェクトの間隔を変更することはできません。

これを回避するには、タイマーの発生率を上げて、希望の時間が経過したかどうかを手動で確認します。これは、動的なタイマーを模倣し、時間の動的更新量を定義することができます:

var lastTriggered: NSDate! 
var dynamicInterval = 1.0 
var timerInterval = 0.1 

override func viewDidLoad() { 
    super.viewDidLoad() 

    lastTriggered = NSDate() 
    _ = NSTimer.scheduledTimerWithTimeInterval(timerInterval, target: self, selector: #selector(hideAllBtns), userInfo: nil, repeats: true) 
} 

func hideAllBtns() { 
    let currentDate = NSDate() 
    if(currentDate.timeIntervalSinceDate(lastTriggered) >= dynamicInterval) { 
     // This will only be called every dynamicInterval seconds 
     // Now call getDifficulty and/or update your dynamicInterval 
     lastTriggered = currentDate 
    } 
} 
関連する問題