2016-09-02 4 views
0

2つのタイマーが同じView Controllerで動作しているときに問題があります。最初のボタンがもう一度タップされた後、もう一方が無効化されてからもう一度戻ると、そのうちの1つが起動する必要があります。私は2つの変数を作成しようとしましたが、正常に構築されますが、その動作は不安定です。正しいアプローチは何でしょうか?ありがとう同じView Controllerで2つのタイマーが動作する必要があります。

@IBAction func Start(_ sender: AnyObject) { 
    timer2.invalidate() 
    timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(ViewController.update), userInfo: nil, repeats: true) 
} 




@IBAction func pauseTimer(_ sender: AnyObject) { 

    timer.invalidate() 

    timer2 = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: Selector(("increaseTimer")), userInfo: nil, repeats: true) 



} 

答えて

0

"フリップフロップ"タイマー効果の種類が必要ですか?

ここで、var timerHasFinishedRunning: Bool = falseを無効にすることを考えましたか?

// When you invalidate, rather 
timer1.invalidate() 
timer1 = nil 

// As goes for timer2 
timer2.invalidate() 
timer2 = nil 

そのように、あなたは行わビュー計算のプロパティをチェックし、あなたのタイマーを持つことができます。

var timer1HasFinishedRunning: Bool { 
    return self.timer1 == nil 
} 

var timer1HasFinishedRunning: Bool { 
    return self.timer2 == nil 
} 

また、あなたは手の込んだことができ、彼らは「不安定」に振る舞うことを言及しますか?あなたのタイマーの間隔は1秒です。何か不安定なことが起きた場合、おそらくは長い間隔が原因です。例えばそれぞれのチェックは毎秒1回しか行われないため、タイマーが無効になったことに気付くまでに1.999999秒かかることがあります。

個人的には、精度を高めるために間隔を1.0ではなく0.1に設定します。

+0

提案していただきありがとうございます。私は自分のアプリのためにそれを使うかもしれない。今私は以下の単純なフリップフロップタイマーコードで何が間違っているのか理解できません。私がそれを走らせると、スレッド1:シグナルSIGABRTのクラッシュ(それは単なる誤った割り当てのケースではない)があります。タイマーを削除した場合2.一時停止は正常に機能します(私の例を編集しました)。ありがとう! –

+0

他の何か私はちょうどあなたのtimer2でセレクタを 'Selector((" increaseTimer "))'に設定しましたが、これは '#selector(ViewController.increaseTimer)'であることに気づいた –

+0

私はこれを試しました。エラーメッセージ: "タイプViewControllerにメンバー 'increaseTimer'がありません" –

関連する問題