Объект таймер только вызывает селектор один раз при стрельбе - PullRequest
0 голосов
/ 22 мая 2018

Я пытаюсь создать приложение, похожее на Snapchat, когда оно снимает видео.Вы должны удерживать кнопку, чтобы начать снимать видео, а затем отпустите его, когда закончите.Я пытаюсь реализовать функцию тайм-аута через 7 секунд, а также индикатор выполнения с помощью объекта Timer.Однако, когда я пытаюсь запустить таймер, он вызывает данный селектор только один раз, и все, хотя я говорю, чтобы он повторялся.

Вот мой код для инициализации кнопки:

let photoButton:UIButton = {
    let but = UIButton(type: .custom)
    but.layer.cornerRadius = 40
    but.layer.borderColor = UIColor.white.cgColor
    but.layer.borderWidth = 4
    but.clipsToBounds = true
    but.addTarget(self, action: #selector(takeVideo), for: .touchDown)
    but.addTarget(self, action: #selector(stopVideo), for: [.touchUpInside, .touchUpOutside])
    but.translatesAutoresizingMaskIntoConstraints = false
    return but
}()

Вот функция takeVideo, которая вызывается, когда пользователь начинает удерживать кнопку нажатой.Я инициализирую и запускаю объект Timer здесь:

@objc func takeVideo() {
    progressBar.isHidden = false

    timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector: #selector(updateProgressbar), userInfo: nil, repeats: true)
    startTime = Date().timeIntervalSince1970()
    timer?.fire()
}

Это функция stopVideo, где я делаю недействительным объект Timer:

@objc func stopVideo() {
    timer?.invalidate()
    // stop video
}

И это updateProgressBar function:

@objc private func updateProgressbar() {
    let maxLength = 7.0
    let difference = Date().timeIntervalSince1970 - startTime!

    progressBar.progress = Float(difference / maxLength)
    if difference >= maxLength {
        stopVideo() // Invalidates the timer and will stop video. 
    }
}

Похоже, у этого человека возникла похожая проблема, но когда я попытался включить его ответ о представлении текущего контроллера представления с помощью асинхронного, он все еще нене работаетВот как я представляю контроллер представления видеозаписи:

let recorder = RecorderViewController()
recorder.db = db
DispatchQueue.main.async(execute: {
    self.present(recorder, animated: true, completion: nil)
})

Редактировать: Я исправил ошибку, касающуюся свойства fireDate объекта Timer (исправление также исправлено ввышеуказанный код).Это исправило мою проблему.

...