2017-10-03 12 views
2

私はボクシングのシミュレーションを作成し、今はアニメーションを追加するために戻っています。さて、私はサスペンスを追加するために "Refのカウントアップ"を追加しています。私は数多くのことを試しましたが、私が望むものは得られませんでした。これらは、UIを一時停止しボクシングカウントアップ/遅延/タイマー

Thread.sleep(forTimeInterval: 1) 
knockdownNumber.text = "\(knockdownNumberInt)" 

sleep(1) 
knockdownNumber.text = "\(knockdownNumberInt)" 

:私が試してみました。彼らは適切な時間を待っていましたが、テキストを変更しませんでした。 これらはすべて1回だけカウントされます(つまり、1,3、または1,8)。

DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) { 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

func delay(_ delay:Double, closure:@escaping()->()) { 
    DispatchQueue.main.asyncAfter(
     deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC), execute: closure) 
} 

として遅延機能付き

delay(1) { 
     self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
    } 

私は(これらがすべてである)関数を呼び出す方法は、後の彼はノックダウンを取得します。このコードは次のようになります。

knockdownNumber.text = "1" 
    knockdownNumberInt = 1 
    downSec() 
    knockdownNumberInt = knockdownNumberInt + 1 
    downSec() 
    knockdownNumberInt = knockdownNumberInt + 1 
    downSec() 
    if fighter2.endurance < 400 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 300 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 200 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 100 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < 0 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 
    if fighter2.endurance < -100 { 
     knockdownNumberInt = knockdownNumberInt + 1 
     downSec() 
    } 

私は本当に困惑しています。

答えて

1

あなたは、このアプローチではほぼあります

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) { (timer) in 
    self.knockdownNumber.text = "\(self.knockdownNumberInt)" 
} 

あなたがする必要があるのはtruerepeatsに設定され、タイマは永遠に繰り返されます。

ここで、タイマーをいつ停止するかを決定する必要があります。私たちはあなたがしたことをするのではなく、タイマーを始める前にこれを決めなければなりません。新しい時間を始めるうちにknockdownNumberIntを減らしてください。タイマーのクロージャーに入れたものが非同期であるため、これは機能しません。

だから我々は我々がカウントアップしているものの数を決める:クラスにcurrentCountDownというプロパティを宣言し

knockdownNumber.text = "1" 
knockdownNumberInt = 3 
if fighter2.endurance < 400 { 
    knockdownNumberInt += 1 // use the "+=" to make it cleaner! 
} 
if fighter2.endurance < 300 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 200 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 100 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < 0 { 
    knockdownNumberInt += 1 
} 
if fighter2.endurance < -100 { 
    knockdownNumberInt += 1 
} 

var currentCountDown = 1 

その後、あなたはこのようなあなたのタイマーを作成することができます

let timer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { [weak self] (timer) in 
    guard let `self` = self else { // I added this to prevent a retain cycle. 
     timer.invalidate() 
     return 
    } 
    self.currentCountDown += 1 
    self.knockdownNumber.text = "\(self.currentCountDown)" 
    if self.currentCountDown == self.knockdownNumberInt { 
     timer.invalidate() 
    } 
} 
+0

この問題の1つは、カウントが完了するまでコードを一時停止しないことです。それを行う方法はありますか? – Peter

+0

@Peterそれはすべきです。私は 'timer.invalidate'を呼び出しました – Sweeper

+0

もう一つ問題があります。スキップカウントボタンを押すと、別の男がノックダウンされると、カウントは永遠に進みます。スキップボタンからカウントをキャンセルする方法はありますか?ありがとう、Peter – Peter