Свифт |Таймер не остановится на недействительном звонке, скорее ускоряется? - PullRequest
0 голосов
/ 19 февраля 2019

Я сделал секундомер с помощью таймера в этом приложении и добавил кнопку старт-стоп, чтобы приостановить и воспроизвести то же самое.Когда нажата кнопка, она отправляется функции, которая делает недействительным таймер, и она должна остановиться. Но, как ни странно, достаточно нажать кнопку «Стоп» вместо того, чтобы таймер как-то ускорился. Я не изменил временной интервал, кроме одного раза, просто объявив его.

Я пытался отключитькнопку запуска, как только она нажата и даже скрыть ее.также пытался изменить временной интервал, но ничего не работает.Чем больше я нажимаю кнопку старт-стоп, тем больше она ускоряется и начинает двигаться намного быстрее, чем за указанный интервал времени.

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 голосов
/ 19 февраля 2019

Насколько я понимаю, у вас есть 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)
}
}
0 голосов
/ 19 февраля 2019

У вас уже есть 2 правильных ответа, но я добавлю свои 2 очка, так как считаю, что исходные условия не были правильными.

Ваша самая большая ошибка - наличие 2 кнопок на первойместо.У вас не возникло бы проблемы, если бы у вас была только одна кнопка и стилизована по необходимости.

class MyTest {
    let magicButton = UIButton()
    let timer: Timer?

    override viewDidLoad() {
        super.viewDidLoad()

        // Setup Button
        magicButton.addTarget(self, action: #selector(buttonPress(_:)), for: .allTouchEvents)
        magicButton.setTitleColor(.white , for: .normal)
        magicButton.frame = yourFrame
        view.addSubview(magicButton)

        customiseButton()
    }

    @objc private func buttonPress() {
        if timer == nil {
            timer = Timer.scheduledTimer(timeInterval: 1, target: self , selector: #selector(updateTimer), userInfo: nil, repeats: true)
        } else {
            timer.invalidate()
        }

        customiseButton()
    }

    private func customiseButton() {
        let isStartButton = timer == nil
        let buttonTitle = isStartButton ? "Start" : "Stop"
        let buttonBackgroundColor: UIColor = isStartButton ? .green : .red

        magicButton.setTitle(buttonTitle, for: .normal)
        magicButton.backgroundColor = buttonBackgroundColor
    }
}

// add updateTimer function too

Таким образом, у вас меньше кода для поддержки и нет конфликта между скрытыми / показанными вещами, поэтому меньше вещей, которыеможет пойти не так магия происходит в методе buttonPress, где, если таймер запущен, вы останавливаете его, в противном случае вы запускаете его, после чего происходит быстрое обновление пользовательского интерфейса кнопки.

0 голосов
/ 19 февраля 2019

Попробуйте добавить обе кнопки одновременно, скрыв кнопку «Стоп», и просто скрывайте и открывайте кнопки при нажатии кнопки.Ваш метод кнопки воспроизведения работает каждый раз, когда вы пытаетесь остановить таймер

...