计时器进入负值/未重置

3

我正在尝试为我的应用程序设置倒计时器。我的代码是这样的,每次拖动图像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)  
    }
    }

4
我可能不会立即初始化计时器(var timer:Timer!)。如果我理解正确,计时器代码会在另一个线程上触发回调函数,直到所需时间到达。因此,我在这里看不到的一件事情是使计时器失效,这非常重要。如果您需要使用不同持续时间的计时器,请编写一个以timerInterval为参数的函数,并执行以下步骤:1)使先前的计时器无效;2)生成具有传递持续时间的新计时器。 - solenoid
请更详细地解释一下您代码的意图?就目前而言,我有几个疑问。 - Feldur
具体而言,您的代码将大约每秒看到一次名为"action routine"的操作例程。
  1. 您描述的问题是希望限制timeClock为正数吗?
  2. 我没有看到您在哪里重置了timeClock的值,因此它将无限制地倒计时。这不是你想要的吗?
您可以采取以下措施之一:
  1. 当timeClock达到零时,您可以终止计时器。
  2. 当timeClock变为负数时,您可以将其重置为某个正值。
需要更多信息吗?
- Feldur
我刚刚更新了我的代码并添加了更多细节。 - 123ZDP
2个回答

1
刚刚发现了我的问题。我根本没有重置计时器。一开始我试图在“action”函数中重置它,但我只需要将它移到底部的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()   
    }
    }

0
var timeClock =  2

由于此代码位于类内但不在任何方法中,因此此行声明了一个名为timeClock的类属性,并将其初始化为2。这将是您创建的该类任何实例的timeClock属性的起始值。

在您倒数计时时正确地更新此值,但是无论如何,您都没有将其重置为2。将属性声明放在action()方法之下并不意味着它会在之后执行。该属性每个实例只会被初始化一次。

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


我刚刚更新了我的代码并将timeClock设置为2。此外,我尝试在“else if”语句中重置它。但是,我仍然遇到了一个问题,即当“if”语句执行一次并开始倒计时,然后在倒计时结束之前再次执行时,倒计时不会失效,并且数字开始进入负数(也开始以不是一秒的随机速度倒计时)。 - 123ZDP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接