【问题标题】:Timer going into negatives/not reseting计时器进入负数/不重置
【发布时间】:2017-07-23 00:10:07
【问题描述】:

我正在尝试为我的应用设置倒计时。我的代码的工作原理是每次拖动图像 whiteDot 并包含 smallDot 时都会开始倒计时,并且 smallDot 会在屏幕上的随机位置生成。我有几个问题

1.) 每次执行“if (whiteDot.frame.contains(smallDot.frame) && smallDot.image != nil)”语句后,我都会尝试将计时器重置为 2 秒。

2.) if语句每执行一次,正常倒计时,但在倒计时归零前再次执行时,开始转为负数,计数快于1秒。

import UIKit

var timeClock =  2

class SecondViewController: UIViewController {

func startTimer() {
    timeClock -= 1
    time.text =  "Time: " + String(timeClock)

if whiteDot.frame.contains(smallDot.frame) && timeClock > 0 {
        timeClock = 2
    }

   else if timeClock == 0 || timeClock < 0 {
        timer.invalidate()
  } 
 }

var timer = Timer()

@IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
                              y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)

    if (whiteDot.frame.contains(smallDot.frame) && smallDot.image != nil) {
        addOne += 1

        score.text = "\(addOne)"

        smallDot.center = spawnRandomPosition()

timeClock = 2
        if timeClock == 0 || timeClock < 0 {
            timer.invalidate()
        }
        else if timeClock > 0 && (whiteDot.frame.contains(smallDot.frame)){
            timeClock = 2

        }
        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(SecondViewController.action), userInfo: nil, repeats: true)  
    }
    }

【问题讨论】:

  • 我可能不会立即初始化计时器(var timer:Timer!)。如果我理解正确,计时器代码会在所需时间发生后通过回调被抛出另一个线程。因此,我在这里看不到的一件事是使您的计时器无效,这很重要。如果您需要让计时器以不同的持续时间触发,我可能会创建一个以 timerInterval 作为参数的函数并执行以下步骤:1)使先前的计时器无效 2)生成具有传递持续时间的新计时器。
  • 请多解释一下代码的意图?照原样,我想知道几件事。
  • 具体来说,您的代码将看到大约每秒调用一次的操作例程。 1.你描述的问题是要约束timeClock为正数吗? 2. 我没有看到你在任何地方重置了 timeClock 的值,所以它会无限期地倒计时。这不是你现在的样子吗?您可以做以下几件事之一:1. 您可以在 timeClock 变为零时终止计时器 2. 您可以在 timeClock 变为负数时将其重置为某个正值更多信息?
  • 我刚刚更新了我的代码并添加了更多细节

标签: ios swift timer counter countdown


【解决方案1】:

刚刚发现我的问题。我根本没有重置计时器。首先,我试图在“动作”函数中重置它,但我只需要将它移到 if 语句的底部即可解决我的所有问题。此代码适用于任何尝试在发生特定操作时重置计时器的人。

class SecondViewController: UIViewController
{
 var addOne = 0

func startTimer() {

    timeClock -= 1

    time.text =  "Time: " + String(timeClock)

   if timeClock <= 0 {
    timer.invalidate()
    //show game over
    }
}

func resetTimer() {
    timer.invalidate()
    timeClock = 3
}
var timer = Timer()

 @IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
    let translation = recognizer.translation(in: self.view)
    if let view = recognizer.view {
        view.center = CGPoint(x:view.center.x + translation.x,
                              y:view.center.y + translation.y)
    }
    recognizer.setTranslation(CGPoint.zero, in: self.view)

    if (whiteDot.frame.contains(smallDot.frame) && smallDot.image != nil) {
        addOne += 1

  score.text = "\(addOne)"

        resetTimer()

        timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(SecondViewController.startTimer), userInfo: nil, repeats: true)

        smallDot.center = spawnRandomPosition()   
    }
    }

【讨论】:

    【解决方案2】:
    var timeClock =  2
    

    由于它出现在一个类中但在任何方法之外,这一行为您的类声明了一个名为timeClock 的属性并将其初始化为2。这将是您创建的该类的任何实例的 timeClock 属性的起始值。

    您在倒计时时正确更新了此值,但您没有将其重置为2。将属性声明低于action() 方法并不意味着它会在之后执行。该属性仅在每个实例中初始化一次。

    您要做的是在安排计时器之前将timeClock 的值设置为2,或者在使计时器无效后将其设置为2。无论哪种方式,您都需要在某处将其重置为 2

    【讨论】:

    • 我刚刚更新了我的代码并设置了 timeClock = 2。我还尝试在“else if”语句中重置它。我仍然遇到问题,当“if”语句执行一次并开始倒计时,并且在倒计时达到零之前再次执行时,倒计时不会无效,并且数字开始变为负数(也开始以非一秒的随机速度倒计时)
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多