Swift定时器应用程序

时间:2017-03-29 03:02:20

标签: ios swift nstimer

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

func record() {
     self.displayLink = CADisplayLink(target: self, selector:#selector(RecordController.updateMeters))
     self.displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
}

func play() {
    self.displayLink = CADisplayLink(target: self, selector: #selector(RecordController.trackAudio))
    self.displayLink.add(to: RunLoop.current, forMode: RunLoopMode.commonModes)
}

4 个答案:

答案 0 :(得分:3)

如果您的start方法在计时器已处于活动状态时运行,则会创建第二个计时器。现在你有两个定时器调用相同的动作,这可以解决你的问题。计划的计时器由其运行循环保留,因此即使您没有引用旧计时器,它仍然存在。

至少你需要使旧计时器无效,否则只需继续使用你的计时器。但是有一些东西可以帮助改善代码:

  • 您的timer属性可能应该是Swift的可选项。将其初始化为Timer()并没有做任何有用的事情。如果timer在没有计时器应该运行时可能为零,那将更有意义。
  • 你应该禁用你的"开始"计时器运行时按钮。当计时器已经启动时,它无效是没有意义的。您可以通过为按钮设置IBOutlet并在按钮的isEnabled属性中更改值来实现此目的。

答案 1 :(得分:1)

源代码中的一个错误。

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

代码如下。

@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()
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

@IBOutlet weak var lbl: UILabel!
var time = 0
var timer : Timer?
var isPause = false

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

}

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