Prática 3: Integrando o Modelo ao View Controller

Assista e acompanhe a prática em sala dos exercícios "Integrando o Modelo ao View Controller". Execute as instruções conforme a apresentação.

Exercício 1: Adequando ao protocolo SessionParameters

1.1. Declare a classe ViewController como aderente ao protocolo SessionParameters

Abra o arquivo ViewController.swift e inclua a declaração do protocolo SessionParameters conforme o código abaixo:

class ViewController: UIViewController<b>, SessionParameters</b> {

1.2. Incluir as propriedades do protocolo

No arquivo ViewController.swift inclua as propriedades do protocolo SessionParameters conforme o código abaixo:

var vibrate: Bool = true
var maxRepetitions: Int {
    if let str = repetitionsLimitTextField.text, r = Int(str) {
        return r
    }
    return 0
}
var duration: NSTimeInterval {
    if let str = timeLimitTextField.text, tl = Int(str) {
        return NSTimeInterval(tl)
    }
    return NSTimeInterval(0)
}

Exercício 2: Substituindo a implementação pelo modelo

2.1. Remova as propriedades inutilizadas da classe ViewController

Remove as seguintes propriedades no arquivo ViewController.swift:

var sessionStartTime: NSTimeInterval
var timer: NSTimer?
var currentRepetitions = 0

2.2. Inclua a propriedade SessionTrack

No arquivo ViewController.swift inclua a propriedade conforme o código abaixo:

var sessionTrack: SessionTrack!

2.3. Remova o método updatedElapsedTime na classe ViewController

2.4. Insira o método configSession

Na seção Outros Métodos do arquivo ViewController.swift adicione o método conforme o código abaixo:

func configSession() {
    self.sessionTrack = SessionTrack(sessionParameters: self)
    self.sessionTrack.updateTimerBlock = {
        (elapsedTime, remainingTime) in
        self.elapsedTimeLabel.text = elapsedTime.getFormattedInterval(miliseconds: false)
        self.elapsedTimeLabel.sizeToFit()
    }
    self.sessionTrack.completionBlock = {
        // Informa o usuário sobre a conclusão da sessão
        let alertView = UIAlertController(title: "Traqt", message: "Sessão concluída!", preferredStyle: UIAlertControllerStyle.Alert)
        alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil))
        self.presentViewController(alertView, animated: true, completion: nil)

        // Reinicia a sessão
        self.reset()
    }
}

2.5. Atualize o texto do Label de Cronometro

No arquivo ViewController.swift no método viewDidLoad localize e atualize a linha conforme o código abaixo:

elapsedTimeLabel.text = "00:00"
elapsedTimeLabel.text = "00:00:00"

2.6. Atualize a implementação do método reset

No arquivo ViewController.swift atualize a implementação do método conforme o código abaixo:

func reset() {
    // Cancela o temporizador do cronometro
    self.timer?.invalidate()
    self.timer = nil

    // Redefine a quantidade de repetições e o horário de início
    self.currentRepetitions = 0
    self.sessionStartTime = nil

    self.sessionTrack.cancelSession()
    self.configSession()
}

2.7. Atualize a implementação do método handleResetButton:vender:

No arquivo ViewController.swift atualize a implementação do método conforme o código abaixo:

func handleResetButton(sender: UIButton) {
    self.reset()
}

2.8. Inclua uma chamada para a configuração da sessão

No arquivo ViewController.swift atualize o método viewDidLoad de acordo com o código abaixo:

override func viewDidLoad() {
   super.viewDidLoad()

   // Código existente anteriormente...
   //  ...

   // Configura a sessão
   self.configSession()
}

2.9. Atualize a implementação do método handleButtonTaps:sender:

No arquivo ViewController.swift atualize a implementação do método conforme o código abaixo:

s
func handleButtonTaps(sender: UIButton) {
    // Inicializa o timer se ele for nulo e atribui o momento de início da sessão
    if timer == nil {
        self.sessionStartTime = NSDate.timeIntervalSinceReferenceDate()
        self.timer = NSTimer.scheduledTimerWithTimeInterval(1.0,
            target: self,
            selector: "updateElapsedTime",
            userInfo: nil,
            repeats: true)
    }

    let sessionState = self.sessionTrack.sessionState
    if sessionState != .Running || sessionState != .Paused {
        self.sessionTrack.startSession()
    }

    // Registra o toque
    self.sessionTrack.addRepetition()

    // Atualiza o título do botão
    sender.setTitle("Toques: \(++currentRepetitions)", forState: UIControlState.Normal)
    sender.setTitle("Toques: \(self.sessionTrack.currentRepetitions)", forState: UIControlState.Normal)
    sender.sizeToFit()

    // Remove o teclado da tela caso ele esteja visível
    self.view.endEditing(true)

    // Verifica se um limite de repetições foi digitado
    if let r = self.repetitionsLimitTextField.text.toInt() {
        // Verifica se o limite foi atingido
        if currentRepetitions >= r {
            // Informa o usuário sobre a conclusão da sessão
            let alertView = UIAlertController(title: "Traqt", message: "O limite de repetições para essa sessão foi atingido.", preferredStyle: UIAlertControllerStyle.Alert)
            alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil))
            self.presentViewController(alertView, animated: true, completion: nil)

            // Reinicia a sessão
            self.reset()
        }
    }
}