我正在创建一个计算结果的应用程序,当显示结果时,我希望从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
}
}
非常感谢任何对这位新手的帮助。
答案 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
}