Prática 1: Funções básicas do App
Assista e acompanhe a prática em sala dos exercícios "Funções básicas do App". Execute as instruções conforme a apresentação.
Exercício 1: Contando toques
1.1. Abrir o arquivo ViewController.swift.
1.2. Localizar o método viewDidLoad.
1.3. Criar botão para contagem de toques.
Insira o código para criação de um botão para contagem de toques, antes do final do bloco do método:
// Cria o botão de contagem de toques
let tapsButton = UIButton(type: .System)
tapsButton.setTitle("Toques: 0", forState: UIControlState.Normal)
tapsButton.contentEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
tapsButton.sizeToFit()
tapsButton.center = self.view.center
self.view.addSubview(tapsButton)
1.4. Testar o App no Simulador.
Testar o App no Simulador e verificar a apresentação do botão centralizado na tela.
1.5. Adicionar a propriedade para contagem de repetições.
No topo da classe ViewController incluir a declaração da propriedade que irá armazenar a contagem de repetições:
//
// MARK: - Propriedades
var currentRepetitions = 0
1.6. Inclua a marcação de seção do arquivo.
Inclua as linhas de comentário acima do método viewDidLoad para marcar uma outra seção do arquivo:
//
// MARK: - Ciclo de Vida da View
1.7. Criar o Action Method para o toque no botão de repetições.
Inclua o código para criação do Action Method que responde aos toques no botão de repetições:
//
// MARK: - Action Methods
func handleButtonTaps(sender: UIButton) {
sender.setTitle("Toques: \(++currentRepetitions)", forState: UIControlState.Normal)
sender.sizeToFit()
}
1.8. Adicionar um target para o evento Touch Up Inside no botão.
No método viewDidLoad incluir o código para adicionar um target ao evento Touch Up Inside no botão de repetições:
tapsButton.addTarget(self, action: "handleButtonTaps:", forControlEvents: UIControlEvents.TouchUpInside)
Exercício 2: Adicionando um Cronômetro
2.1. Adicionar uma propriedade para o objeto UILabel do Cronômetro.
Na seção de propriedades do arquivo ViewController.swift adicionar uma propriedade para armazenar uma referência ao Label que apresentará o cronometro:
var elapsedTimeLabel: UILabel!
2.2. Adicionar a inicialização do Label.
No final do método viewDidLoad adicionar a inicialização do objeto UILabel para o cronometro:
// Cria o label de contagem de tempo
elapsedTimeLabel = UILabel()
elapsedTimeLabel.text = "00:00"
elapsedTimeLabel.sizeToFit()
elapsedTimeLabel.center = CGPoint(x: self.view.center.x, y: self.view.center.y + 40)
self.view.addSubview(elapsedTimeLabel)
2.3. Adicionar as propriedades para mecânica do cronometro.
Na seção de propriedades do arquivo ViewController.swift adicionar mais duas propriedades usadas para mecânica do cronometro:
var sessionStartTime: NSTimeInterval?
var timer: NSTimer?
2.4. Incluir o método para atualizar a apresentação de tempo do cronometro.
Incluir o código para o método que fará o cálculo do tempo transcorrido desde o início da sessão e atualizará o conteúdo do Label com essa informação:
//
// MARK: - Outros Métodos
func updateElapsedTime() {
if let startTime = sessionStartTime {
let refreshTime = NSDate.timeIntervalSinceReferenceDate()
let elapsedTime = refreshTime - startTime
let minutes = Int(floor(elapsedTime / 60.0))
let seconds = Int(elapsedTime) - (minutes * 60)
let minuteDesc = (minutes >= 10 ? "" : "0") + "\(minutes)"
let secondDesc = (seconds >= 10 ? "" : "0") + "\(seconds)"
elapsedTimeLabel.text = "\(minuteDesc):\(secondDesc)"
}
}
2.5. Atualizar o método do botão de repetições.
Atualizar o método do botão de repetições de forma que ele marque o início da sessão quando o usuário tocar o botão pela primeira vez:
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)
}
// Atualiza o título do botão
sender.setTitle("Toques: \(++currentRepetitions)", forState: UIControlState.Normal)
sender.sizeToFit()
}
2.6. Execute o App e teste o cronometro
Exercício 3: Adicionando Comandos
3.1. Adicionar o botão para re-inicio da sessão.
No final método viewDidLoad adicionar o código para incluir um botão de re-inicio da sessão:
// Cria o botão de reinicio da sessão
let resetButton = UIButton(type: .System)
resetButton.setTitle("Reiniciar", forState: UIControlState.Normal)
resetButton.sizeToFit()
resetButton.frame = CGRect(x: (self.view.frame.size.width / 2 - resetButton.frame.size.width / 2),
y: 28,
width: resetButton.frame.size.width,
height: resetButton.frame.size.height)
resetButton.addTarget(self, action: "handleResetButton:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(resetButton)
3.2. Adicionar um target para o evento Touch Up Inside no botão.
No método viewDidLoad incluir o código para adicionar um target ao evento Touch Up Inside no botão de re-inicio da sessão:
func handleResetButton(sender: UIButton) {
// 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
}
3.3. Execute o App e teste as alterações.
Exercício 4: Adicionando Parâmetros
4.1. Incluir as propriedades para os UITextFields de Limite de Repetições e de Tempo.
Na seção de propriedades do arquivo ViewController.swift incluir as propriedades conforme o código abaixo:
// Declara o UITextField para configurar o limite de repetições
var repetitionsLimitTextField: UITextField = {
var frame = CGRect(x: 8, y: 28, width: 110, height: 30)
let textField = UITextField(frame: frame)
textField.placeholder = "Repetições"
textField.borderStyle = UITextBorderStyle.RoundedRect
textField.keyboardType = UIKeyboardType.NumberPad
return textField
}()
// Declara o UITextField para configurar o limite de tempo
lazy var timeLimitTextField: UITextField = {
var frame = CGRect(x: self.view.frame.width - 110 - 8, y: 28, width: 110, height: 30)
let textField = UITextField(frame: frame)
textField.placeholder = "Limite"
textField.borderStyle = UITextBorderStyle.RoundedRect
textField.keyboardType = UIKeyboardType.NumberPad
return textField
}()
4.2. Adicionar os UITextField's na tela.
No método viewDidLoad incluir o código para adicionar os UITextField's declarados anteriormente a estrutura de Views da tela principal:
// Adiciona os UITextField para configurar o limite de repetições e de tempo
self.view.addSubview(self.repetitionsLimitTextField)
self.view.addSubview(self.timeLimitTextField)
4.3. Adicionar Código para remover o teclado da tela no toque de repetição.
No final do método handleButtonTaps incluir o código abaixo para remover o teclado da tela quando o usuário tocar no botão de repetição:
// Remove o teclado da tela caso ele esteja visível
self.view.endEditing(true)
4.4. Atualizar o método de repetições para verificar os limites.
No final do método handleButtonTaps incluir o código abaixo para verificar se o usuário atingiu o limite de repetições estipulado no campo:
// Verifica se um limite de repetições foi digitado e atingido
if let str = self.repetitionsLimitTextField.text,
let r = Int(str)
where 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()
}
4.5. Atualizar o método de atualização do cronometro para verificar os limites.
No final do método updateElapsedTime incluir o código abaixo na última linha do bloco if para verificar se o usuário atingiu o limite de repetições estipulado no campo:
// Verifica se um limite de tempo foi digita e atingido
if let str = timeLimitTextField.text, let tl = Int(str) where elapsedTime >= NSTimeInterval(tl * 60) {
// Informa o usuário sobre a conclusão da sessão
let alertView = UIAlertController(title: "Traqt", message: "O tempo limite para essa sessão foi atingido.", preferredStyle:
UIAlertControllerStyle.Alert)
alertView.addAction(UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel, handler: nil))
presentViewController(alertView, animated: true, completion: nil)
// Reinicia a sessão
reset()
}
4.6. Incluir o método de reset da sessão.
Na seção Outros Métodos do arquivo ViewController.swift, incluir o código do método reset:
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
}