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()
}
}
}