【问题标题】:Simple Timer in iOSiOS中的简单计时器
【发布时间】:2016-10-20 12:43:01
【问题描述】:

我正在尝试使用 Swift 在 iOS 中制作一个简单的计时器。 该程序运行良好,但每当按下我的 START UIButton 时,计时器的功能就会启动并运行多次,与按下按钮一样多。

我想在定时器功能启动后立即禁用 START UIButton,这样它就不会运行多次。

请帮助我。

这是我的 ViewController 代码

import UIKit

class ViewController: UIViewController {
    var time = 0.0
    var timer = Timer()

    @IBOutlet weak var lbl: UILabel!

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

    @IBAction func pause(_ sender: UIButton)
    {
        timer.invalidate()
    }

    @IBAction func reset(_ sender: UIButton)
    {
        timer.invalidate()
        time = 0.0
        lbl.text = ("0")
    }

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

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

【问题讨论】:

  • 您可以简单地将按钮禁用到 start() 方法中

标签: ios swift timer


【解决方案1】:

要禁用您的按钮,您只需在 start 函数中设置它的 isUserInteractionEnabled 属性:

@IBOutlet weak var startButton: UIButton!

@IBAction func start(_ sender: UIButton) {
    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
    startButton.isEnabled = false
}

然后在pausereset 方法中将其设置回true:

@IBAction func pause(_ sender: UIButton) {
    timer.invalidate()
    startButton.isEnabled = true
}

@IBAction func reset(_ sender: UIButton) {
    timer.invalidate()
    startButton.isEnabled = true 
    //the rest of your code
}

【讨论】:

  • 最好设置按钮的enabled属性,而不是使用userInteractionEnabled。它将是button.userInteractionEnabled = true,而不是button.isUserInteractionEnabled = true。您不想使用 getter 调用 setter。
  • @rmaddy 完全同意第一个陈述,但不同意第二个陈述。从 swift 3 开始,它被重命名,button.userInteractionEnabled = true 甚至无法编译。
  • @rmaddy 看起来像是对所有 Bool 属性的有意重命名。 enabled->isEnabled 也被重命名,以及隐藏、不透明、集中和一堆其他 ;)
【解决方案2】:

确保计时器只启动和停止一次的最可靠方法是编写两个检查当前状态的方法(如果计时器当前正在运行,则它不是nil):

var timer : Timer?

func startTimer()
{
  guard timer == nil else { return }
  timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(ViewController.action), userInfo: nil, repeats: true)
  // disable start button
}

func stopTimer()
{
  guard timer != nil else { return }
  timer!.invalidate()
  timer = nil
  // enable start button
}

在方法中,您可以相应地启用/禁用按钮。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    相关资源
    最近更新 更多