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
}

4.7. Execute o App e teste as alterações.