XCode 6 - 延迟循环中的迭代?

标签 xcode swift

我正在使用 while 循环测试基本动画。当用户触摸开始按钮时,每次单击该按钮时都会随机出现一个图像。然后我将相同的代码放在 while 循环中,图像似乎没有移动。我认为它只是在迭代中移动得太快,因此看起来没有移动。那么,有没有一种方法(简单或其他)可以延迟循环的速度,以便我可以看到某种程度的过渡?我认为循环的速度就是这样做的原因,因为文本立即输出到标签,因此我知道循环至少正在工作。这是我所拥有的...

@IBAction func btnStart(sender: AnyObject) {

    isMoving = true
    var i = 0
    while (i != 200) //arbitrary number of iterations chosen for this example
    {
        var x = arc4random_uniform(400)
        var y = arc4random_uniform(400)
        myButton.center = CGPointMake(CGFloat(x), CGFloat(y));
        ++i
        lblHitAmount.text = String(i) //200 appears instantaneously in label, loop is working
   }
 }  

编辑:

var timer = NSTimer()
var counter = 0    

timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("tolabel"), userInfo: nil, repeats: true)


    var i = 0
    while (i != 800)
    {
        var x = arc4random_uniform(400)
        var y = arc4random_uniform(400)
        btnBug.center = CGPointMake(CGFloat(x), CGFloat(y));
        ++counter
        ++i

        //lblHitAmount.text = String(i)

   }

func tolabel(){
    lblHitAmount.text = String(counter++)
}

最佳答案

因此,要理解为什么会出现这种行为,您需要了解运行循环的概念。每个应用程序都有一个运行循环,本质上是一个无限循环。循环的每次迭代都会执行许多操作。其中两个主要任务是处理事件(例如点击按钮)和更新 GUI。 GUI 每个运行循环仅更新一次

您的事件处理代码(用于点击 btnStart)在单个运行循环迭代内运行。无论您将循环延迟多长时间(例如 10 分钟),GUI 都会保持卡住状态,直到完成为止,然后仅显示文本设置的最后一个值。这就是应用程序和程序卡住的原因。他们在运行循环的单次迭代中运行某些内容,不允许执行返回以更新 GUI。

如果您想定期更新文本,您应该查看 NSTimer 。您可以设置一个每 X 秒重复一次的计时器,每次触发计时器时,它将在运行循环的不同迭代中执行,从而允许使用中间值更新 GUI:

@IBAction func btnStart(sender: AnyObject) {
    NSTimer.scheduleTimerWithTimeInterval(0.5, target: self, selector: "updateText:", userInfo: nil, repeats: false) 
}

func updateText(timer: NSTimer) {
    // do something to update lblHitAmount.text
    // if you want to execute this again run:
    NSTimer.scheduleTimerWithTimeInterval(0.5, target: self, selector: "updateText:", userInfo: nil, repeats: false) 
    // if you are done with the "loop" don't call scheduleTimerWithTimeInterval again.
}

关于XCode 6 - 延迟循环中的迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27096089/

相关文章:

swift - 可选 vs 抛出函数

ios - 在 iOS 8 上获取键盘大小不适用于外部键盘

ios - 在 Swift 中使用闭包作为完成处理程序时的返回值

c - 如何阻止 Cocoapods 导入保护伞中的私有(private) header

ios - 如何使用 Xcode Storyboard 保持导入图像的原始尺寸?

iphone - 所有程序中的 SIGABRT 和 SIGTERM THREAD

swift - 使用 po 时 Xcode 代码控制台打印空白

ios - Apple TLS 与 Objective-C 和 Swift 之间的区别

xcode - 在 Xcode 中创建新文件时出现奇怪的相对路径。是否与 macOS Catalina beta 4 版本有关?

iphone - 仅使用 objective-c 在 iPhone openGL ES 中绘制文本