2016-05-12 3 views
1

私は結果を計算するアプリケーションを作成していますが、結果が表示されたら、0からその結果まで非常に素早く数えたいと思いますが、ゆっくりとカウントしてみてください。UILabelを繰り返し更新し、変更する速度を制御するにはどうすればよいですか?

this postの回答は、私が探しているものに非常に近いようですが、どのように行うべきか把握できない状態を管理しています。

私はこれを開始しました:ここにそれで行く他のクラスだ

class ViewController: UIViewController { 

let calculator = CalculatorBrain(weightLifted: 0, repetitions: 0) 

@IBOutlet weak var weightLifted: UITextField! 
@IBOutlet weak var repetitions: UITextField! 
@IBOutlet weak var oneRepMax: UILabel! 

@IBAction func calculate(sender: UIButton) { 
    let lift = Double(weightLifted.text!) 
    let reps = Double(repetitions.text!) 
    calculator.weightLifted = lift! 
    calculator.repetitions = reps! 
    let max = Int(calculator.calculateOneRepMax()) 
    for i in 0...max { 
     oneRepMax.text = "\(i)" <-- I think this approach is where I'm going wrong 
    } 
} 

class CalculatorBrain: NSObject { 

var weightLifted: Double 
var repetitions: Double 
var oneRepMax: Double? 

init(weightLifted: Double, repetitions: Double) { 
    self.weightLifted = weightLifted 
    self.repetitions = repetitions 
} 

func calculateOneRepMax() -> Double { 
    // Epley Method 

    oneRepMax = self.weightLifted * (1 + (self.repetitions)/30) 
    return oneRepMax! 
} 
} 

他のスレッドでのアドバイスに続いては、私はのためのループを排除し、作成する必要がありますメンバ変数にその状態を保持する新しいメソッドです。その後、そのメソッドをイベントハンドラから呼び出し、最初の表示の状態を設定し、最初の項目を表示して何かを実行し、戻ります。

しかし、私はoneRepMax.textの値が0から開始して最大値までカウントするのを見たいので、ループなしでこれを行う方法はどこかには分かりません。私はこのようなものでoneRepMax.textを更新するために、別の関数を作成した場合:

func updateCounter(max: Int) -> Int { 
    for i in 1...max { 
     return max <-- this will just return the max value after the loop stops running which is the same problem I already have 
     } 
    } 

この初心者のためのすべてのヘルプは大歓迎です。

答えて

0

このようなループを実行すると、テキストはおそらくプロセスが数を増やす(非常に高速な)ようにすばやく更新されます。私が正しくあなたの質問を理解していれば、あなたはおそらく

let timeInterval = 0.4 // how quickly you want the number to change 

var timer = NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: #selector(MyClass.updateLabel), userInfo: nil, repeats: true) 

var counter: Int = 0 
var max: Int = 0 

func updateLabel(){ 
    if(counter == max){ 
    timer.invalidate() 
    } 
    // Increment counter and update label 
} 
+1

これ以下とほぼ同様のタイマーを使用したいと思う働いた - 感謝を!私が言及したもう一つのスレッドは、新しい関数のメンバ変数に状態を保持すると言っています。 NSTimerは本質的に私のために状態を管理していますか? – Jim

+1

NSTimerは機能を遅らせるツール(updateLabel)です。実際に行っているのは、指定されたtimeIntervalがその関数を実行するのを待つようにプロセッサに指示することです。その関数のカウンタと最大値を追跡して、発火を完了できるタイミングをタイマに伝えることができます。イベントハンドラは、タイマーを開始し、状態(つまりカウンタ)を追跡し、最終的に操作を終了します。 – Louie4

+1

それが明確でない場合は、このドープの類推をチェックしてください。あなたのプログラムを花火と考えてください。あなたのイベントハンドラはヒューズです.NSTimerは、すべての迫撃砲を一度に撮影し、指定された間隔で花火を点灯させ、迫撃砲を含むボックスは花火の順序を管理し、最終的には射撃が完了します。それが迫撃砲から出ているとき)。 – Louie4

0

タイマーを使用してみてください。コールバックでラベルを設定します。あなたはあなたが望むものを得るためにインターバルでプレーする必要があります。

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "yourCallback:", userInfo: nil, repeats: false) 
関連する問題