Prática 2: Melhorando o Histórico de Atividades

Assista e acompanhe a prática em sala dos exercícios "Melhorando o Histórico de Atividades". Execute as instruções conforme a apresentação.

Exercício 1: Criando a tela de Histórico

1.1. Desenhar um Table View Controller para Histórico

Desenhar um Table View Controller para Histórico próximo ao View Controller de Formulário de Atividade.

1.2. Criar um Segue para o View Controller de Histórico

Criar um Segue do tipo Show para o View Controller de Histórico a partir da célula de histórico de atividades do formulário.

1.3. Alterar o Título do View Controller para Histórico


Exercício 2: Criando uma Célula Personalizada

2.1. Adicionar a Pasta de Icones no Catálogo de Imagens

Baixe os ícones que serão utilizados nessa tela a partir deste link. Copie-os para dentro da subpasta Icons no catálogo de imagens do projeto (Image Catalog).

2.2. Configurar a Prototype Cell

Configurar a prototype Cell para 64 pontos de altura. Configurar o identifier da célula para SessionCell.

2.3. Incluir os Labels no Prototype Cell

Desenhar 3 UILabel's na tela com as seguintes Propriedades:

  • Label "Data" - Origin: (32, 7)
  • Label "Tempo" - Origin: (32, 36)
  • Label "Repetições" - Origin: (152, 36)

2.4. Incluir 4 Image Views

Desenhar 4 UIImageView's na tela com as seguintes Propriedades:

  • Data:
    • Image: Icon_Date
    • Frame: (8, 8, 16, 16)
  • Tempo:
    • Image: Icon_ElapsedTime
    • Frame: (8, 39, 16, 16)
  • Repetições:
    • Image: Icon_Repetitions
    • Frame: (128, 39, 16, 16)
  • Resultado:
    • Image: Icon_SessionOutcome_0
    • Frame: (560, 16, 32, 32)

2.5. Incluir as Constraints do Auto-Layout

Usando o menu Resolve Auto Layout Constraints selecionar a opção Add Missing Constraints na seção All Views in Table View Controller.


Exercício 3: Criando uma classe para a Célula Personalizada

3.1. Criar a Classe HistoryTableViewCell

Criar a nova classe no grupo Views, usando o template Cocoa Touch Class que herda de UITableViewCell

2. Atualizar o Código da Classe

Substituir a implementação padrão pelo código abaixo:

class HistoryTableViewCell: UITableViewCell {

    //
    // MARK: - Outlets


    //
    // MARK: - Properties

}

3.3. Modificar o Custom Class da célula para HistoryTableViewCell

3.4. Criar Outlets para os Componentes da Tela

Criar os Outlets conforme o código abaixo:

@IBOutlet weak var dateLabel: UILabel!
@IBOutlet weak var elapsedTimeLabel: UILabel!
@IBOutlet weak var repetitionsLabel: UILabel!
@IBOutlet weak var repetitionsIcon: UIImageView!
@IBOutlet weak var sessionOutcomeIcon: UIImageView!

3.5. Inclua a Propriedade session

Inclua o seguinte código na seção Properties:

var session: Session? {
    didSet {
        if let s = self.session {
            let dateFormatter = NSDateFormatter()
            dateFormatter.dateStyle = NSDateFormatterStyle.LongStyle
            dateFormatter.timeStyle = NSDateFormatterStyle.MediumStyle

            self.sessionOutcomeIcon.image = UIImage(named: "Icon_SessionOutcome_\(s.sessionOutcome)")
            self.dateLabel.text = dateFormatter.stringFromDate(s.startTime!)
            self.elapsedTimeLabel.text = NSTimeInterval(s.elapsedTime!.floatValue).getFormattedInterval(miliseconds: false)

            if s.activity!.repetitions!.integerValue > 0 {
                self.repetitionsIcon.hidden = false
                self.repetitionsLabel.hidden = false
                self.repetitionsLabel.text = "\(s.totalRepetitions!)"
            } else {
                self.repetitionsIcon.hidden = true
                self.repetitionsLabel.hidden = true
            }
        }
    }
}

Exercício 4: Configurando o Table View

4.1. Criar a Classe SessionHistoryTableViewController

Criar a classe com o nome SessionHistoryTableViewController, herdando de SwiftyIOTableViewController.

4.2. Ajustar a propriedade Class do View Controller de Histórico para a nova Classe

4.3. Incluir a Propriedade activity

Inclua a propriedade activity usando o código abaixo:

//
// MARK: - Properties

var activity: Activity!

4.4. Atualizar o método viewDidLoad

Atualizar o método viewDidLoad conforme o código abaixo:

override func viewDidLoad() {
    super.viewDidLoad()

    let predicate = NSPredicate(format: "%K == %@", "activity.activityId", self.activity.activityId!)
    self.fetchedResultsController = TraqtDataContext.sharedInstance.sessions.getFetchedResultsController(predicate, sectionNameKeyPath: nil, cacheName: nil, sortDescriptors: NSSortDescriptor(key: "startTime", ascending: false))
}

4.5. Incluir os métodos necessários do UITableViewDelegate

Incluir os métodos conforme o código abaixo:

//
// MARK: - UITableViewDataSource/UITableViewDelegate

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("SessionCell", forIndexPath: indexPath) as! HistoryTableViewCell
    let session = self.fetchedResultsController!.objectAtIndexPath(indexPath) as! Session

    cell.session = session
    return cell
}

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    return 64.0
}

4.6. Atualizar o método prepareForSegue:identifier: em ActivityFormViewController

Atualizar o método usando o código abaixo:

//
// MARK: - Navigation

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if let destVC = segue.destinationViewController as? SessionHistoryTableViewController {
        destVC.activity = self.activity
    }
}

4.7. Adicione um Outlet para o Label da Celula de Histórico em ActivityFormViewController

Adicione o Label conforme o código abaixo:

@IBOutlet weak var historyLabel: UILabel!

4.8. Atualizar o Código do Método viewDidLoad em ActivityFormViewController

Atualizar o código do método conforme a listagem abaixo:

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    if let a = self.activity {
        // Código anterior...
        // ...

        // Quantidade de sessões dessa atividade
        if let sessions = a.sessions?.count {
            if sessions > 0 {
                self.historyLabel.text = "\(sessions) " + ((sessions == 1) ? "Sessão" : "Sessões")
            }
        }
    } else {
        self.title = "Nova Atividade"
    }
}