如何重复更新UILabel并控制其更改速度?

时间:2016-05-12 13:56:53

标签: swift for-loop uilabel

我正在创建一个计算结果的应用程序,当显示结果时,我希望从0到结果非常快速地计算,但是你可以慢慢地看到数字嗖嗖声因为它很重要。

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!
 }
}

遵循另一个线程中的建议,我应该摆脱for循环并创建一个新的方法,将其状态保存在成员变量中。然后,从事件处理程序中调用该方法,为第一个显示设置状态,显示第一个项目,执行某些操作,然后返回。

但是因为我想看到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
       }
    }

非常感谢任何对这位新手的帮助。

2 个答案:

答案 0 :(得分:0)

尝试使用计时器。在你的回调中设置你的标签。你需要玩间隔来获得你想要的东西。

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "yourCallback:", userInfo: nil, repeats: false)

答案 1 :(得分: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
}