Ноль нельзя присвоить типу "Таймер"?

Привет! Я заканчиваю исследование болезни Альцгеймера - я хочу иметь возможность записать время, необходимое для завершения рисунка (для рисования пациенту требуется всего несколько секунд). Я хочу записать как время, проведенное яблочным карандашом на планшете, так и общее время, потраченное на завершение рисунка (время на планшете плюс время между штрихами).

Я создал это приложение до сих пор, но не могу заставить работать таймер.

У меня есть доска для рисования / каракули.

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

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

Попробовал сменить скрипт, попробовал расспросить друзей. Я довольно новый, чтобы быстро, так что любая помощь очень ценится.


import UIKit

class ViewController: UIViewController {


    @IBOutlet weak var canvasView: CanvasView!
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    @IBAction func clearCanvas(_ sender: Any) {
        canvasView.clearCanvas()
        timer.invalidate()

        seconds = 0    
        timeDrawing.text = "\(seconds)"
    }
    @IBOutlet weak var timeDrawing: UILabel!

    var seconds = 0 
    var timer = Timer()
    var isTimerRunning = false //This will be used to make sure only one timer is created at a time.
    var resumeTapped = false
    var touchPoint:CGPoint!
    var touches:UITouch!

    func runTimer() {
        timer = Timer.scheduledTimer(timeInterval: 1, target: self,   selector: (#selector(ViewController.updateTimer)), userInfo: nil, repeats: true)
    }
    private(set) var from: Date?

    @objc func updateTimer() {
        let to = Date()
        let timeIntervalFrom = (from ?? to).timeIntervalSince1970
        let time = to.timeIntervalSince1970 - timeIntervalFrom
        timeDrawing.text = "\(round(time))" //This will update the label.
    }

    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesBegan(touches, with: event)
        guard let touch = touches.first else { return }
        let touches = touch.location(in: canvasView) // or maybe ...(in: self)

        if touch.type == .pencil  {
            if !isTimerRunning {
                from = Date()
                runTimer()
            }
        }
    }

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        if !isTimerRunning {
            timer.invalidate()
            timer = nil
            from = nil
            timeDrawing.text = "0"
        }
}
}

Я надеялся, что когда яблочный карандаш коснется планшета, запустится таймер. И затем, когда карандаш покинул планшет, он остановил один таймер и запустил один из таймеров (еще не реализован). (Мне еще нужно добавить еще один таймер на время между ударами, любая помощь в этом тоже будет признательна.)

1 ответ

Только опциональные значения могут принимать значения nil, вы можете сделать объект таймера необязательным, как этот

 var timer:Timer?

Да, это имеет смысл. отредактированный

Другие вопросы по тегам