Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 快速定时器应用程序_Ios_Swift_Nstimer - Fatal编程技术网

Ios 快速定时器应用程序

Ios 快速定时器应用程序,ios,swift,nstimer,Ios,Swift,Nstimer,我试图用swift3构建一个简单的ios定时器应用程序。我使用以下代码成功创建了一个应用程序。它有三个按钮,一个启动计时器,一个停止计时器,这意味着重置,一个暂停计时器。所有按钮都在工作,但当我在计时器运行时再次单击start时,计时器间隔会加快(意味着在一秒钟内调用选择器功能两次)。如何解决这个问题。 这是我的密码 @IBOutlet weak var lbl: UILabel! var time = 0 var timer = Timer() @IBOutlet weak var star

我试图用swift3构建一个简单的ios定时器应用程序。我使用以下代码成功创建了一个应用程序。它有三个按钮,一个启动计时器,一个停止计时器,这意味着重置,一个暂停计时器。所有按钮都在工作,但当我在计时器运行时再次单击start时,计时器间隔会加快(意味着在一秒钟内调用选择器功能两次)。如何解决这个问题。 这是我的密码

@IBOutlet weak var lbl: UILabel!
var time = 0
var timer = Timer()

@IBOutlet weak var start: UIButton!
@IBOutlet weak var stop: UIButton!
@IBOutlet weak var pause: UIButton!
@IBAction func start(_ sender: AnyObject) {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
@IBAction func stop(_ sender: AnyObject) {
    //timer.invalidate()
    time = 0
    lbl.text = "0"
}
@IBAction func pause(_ sender: AnyObject) {
    timer.invalidate()
}
override func viewDidLoad() {
    super.viewDidLoad()

}

func action() {
    time += 1
    lbl.text = String(time)
}

如果
start
方法在计时器已激活时运行,则创建第二个计时器。现在您有两个计时器调用相同的操作,这就解释了您的问题。定时计时器由其运行循环保留,因此即使您没有对旧计时器的引用,它仍然存在

至少,您需要使旧计时器无效,或者继续使用现有计时器。但是有一些东西可以帮助代码变得更好:

  • 您的
    timer
    属性可能是一个Swift选项。将其初始化为
    Timer()
    没有任何用处。如果在没有计时器运行的情况下,
    计时器
    可以为零,则更有意义
  • 当计时器运行时,您可能应该禁用“开始”按钮。当计时器已经启动时,将其激活是没有意义的。您可以通过为按钮设置一个
    IBOutlet
    ,并在按钮的
    isEnabled
    属性时更改该值来完成此操作

我认为如果计时器正在运行,您需要做的是使其无效

@IBAction func start(_ sender: AnyObject) {
    if (timer) {
        timer.invalidate()
    } 
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}

源代码中的一个错误

首先停止存在计时器,然后启动新计时器

代码如下

@IBAction func start(_ sender: AnyObject) {
    timer.invalidate()
    timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
}
对于停止计时器,使用失效计时器功能

@IBAction func stop(_ sender: AnyObject) {
    timer.invalidate()
}

如果没有很多其他的改变,这是行不通的。首先,您需要将
计时器设置为可选。然后,您需要将
计时器设置为
nil
,无论何时该计时器无效。
@IBAction func stop(_ sender: AnyObject) {
    timer.invalidate()
}