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 = nilself.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ãosender.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() } }}