斯威夫特|计时器不会在无效呼叫上停止,而是加快速度吗?

时间:2019-02-19 12:36:47

标签: ios swift uibutton nstimer stopwatch

我在此应用中使用Timer进行了秒表计时,并添加了“开始停止”按钮以暂停和播放该秒表。 当按下按钮时,它将发送到使计时器无效的功能,并且应该停止。 但是当按下“停止”按钮时就足够了,而不是以某种方式停止了计时器 除了声明一次之外,我没有更改时间间隔。

我曾经尝试过禁用开始按钮,甚至将其隐藏。也尝试更改时间间隔,但没有任何效果。我按下启动停止按钮的次数越多,它的速度就越快,并且开始运行的速度比上述时间间隔要快得多。

startButton.frame = CGRect(x: 0, y: UIScreen.main.bounds.height * 0.9 , width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 0.1)
    startButton.setTitle("Start Timer", for: .normal)
    self.view.addSubview(startButton)
    startButton.setTitleColor(.white , for: .normal)
    startButton.backgroundColor = .red
    startButton.addTarget(self, action: #selector(playButton(_:)), for: .allTouchEvents)

    stopButton.frame = CGRect(x: 0, y: UIScreen.main.bounds.height * 0.9 , width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 0.1)
    stopButton.setTitle("Stop Timer", for: .normal)
    stopButton.setTitleColor(.white , for: .normal)
    stopButton.backgroundColor = .red
    stopButton.addTarget(self, action: #selector(pauseButton(_:)), for: .allTouchEvents)
@objc func playButton(_ sender : Any)
{
    timer = Timer.scheduledTimer(timeInterval: 1, target: self , selector: #selector(updateTimer), userInfo: nil, repeats: true)
    startButton.isEnabled = false
    stopButton.isEnabled = true
    isRunning = true
    self.view.addSubview(stopButton)
    startButton.isHidden = true
    stopButton.isHidden = false



}

@objc func pauseButton(_ sender: Any) {
    self.view.addSubview(startButton)
    timer.invalidate()

    stopButton.isHidden = true
    startButton.isHidden = false

    startButton.isEnabled = true
    stopButton.isEnabled = false

    isRunning = false

}


@objc func updateTimer(_ sender : Any)
{
    counter += 0.1
    titleLabel.text = String(format: "%.1f", counter)
}

3 个答案:

答案 0 :(得分:1)

请尝试通过隐藏停止按钮来同时添加两个按钮,并在单击按钮时隐藏和取消隐藏按钮。尝试停止计时器时,您的播放按钮方法每次都会运行

答案 1 :(得分:1)

据我所知,您有2个错误。

第一个答案是另一个答案。确实建议您不要总是添加新的UIButton,而应仅对每个按钮使用hide / unhide属性。

第二个错误是如何添加目标。您正在使用.allTouchEvents,但是您可能打算将.touchUpInside用作控件状态。

请参见以下更正的代码供您参考:

import UIKit

class ViewController: UIViewController {

@IBOutlet weak var titleLabel: UILabel!

var startButton: UIButton!
var stopButton: UIButton!
var timer: Timer!
var counter: Double = 0.0

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

    startButton = UIButton(frame: CGRect(x: 0, y: UIScreen.main.bounds.height * 0.9 , width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 0.1))
    startButton.setTitle("Start Timer", for: .normal)
    startButton.setTitleColor(.white , for: .normal)
    startButton.backgroundColor = .red
    startButton.addTarget(self, action: #selector(playButton(_:)), for: .touchUpInside)
    self.view.addSubview(startButton)
    self.startButton.isHidden = false

    stopButton = UIButton(frame: CGRect(x: 0, y: UIScreen.main.bounds.height * 0.9 , width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height * 0.1))
    stopButton.setTitle("Stop Timer", for: .normal)
    stopButton.setTitleColor(.white , for: .normal)
    stopButton.backgroundColor = .red
    stopButton.addTarget(self, action: #selector(pauseButton(_:)), for: .touchUpInside)
    self.view.addSubview(stopButton)
    self.stopButton.isHidden = true
}

@objc func playButton(_ sender : Any) {
    timer = Timer.scheduledTimer(timeInterval: 1, target: self , selector: #selector(updateTimer), userInfo: nil, repeats: true)

    startButton.isEnabled = false
    stopButton.isEnabled = true
    startButton.isHidden = true
    stopButton.isHidden = false
}

@objc func pauseButton(_ sender: Any) {
    timer.invalidate()

    stopButton.isHidden = true
    startButton.isHidden = false
    startButton.isEnabled = true
    stopButton.isEnabled = false
}


@objc func updateTimer(_ sender : Any)
{
    counter += 0.1
    titleLabel.text = String(format: "%.1f", counter)
}
}

答案 2 :(得分:1)

您已经有2个正确答案,但由于我认为您开始的前提不正确,所以我会加2p。

您最大的错误是首先拥有2个按钮。如果您只有一个按钮并根据需要设置样式,就不会有问题。

    [HttpPost]
    public IHttpActionResult Save(Company company)
    {
      var result = _companyRepository.Create(company);
      return Ok(result);
    }

这样,您需要维护的代码更少,并且隐藏/显示的内容之间没有冲突,因此,可能出错的内容更少。 魔术发生在buttonPress方法中,在该方法中,如果启动了计时器,则将其停止,否则启动一个计时器,然后快速更新按钮UI。