7
respostas

Atribuição de accessoryType não está funcionando

Meu código compila e executa normalmente, mas ao clicar em uma célula, nada acontece. Não aparece o checkmark esperado. Segue a classe inteira.

import UIKit

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    var itens = [Item(name: "Eggplant", calories: 10),
                 Item(name: "Brownie", calories: 10),
                 Item(name: "Zucchini", calories: 10),
                 Item(name: "Muffin", calories: 10),
                 Item(name: "Coconut oil", calories: 500),
                 Item(name: "Chocolate frosting", calories: 1000),
                 Item(name: "Chocolate chip", calories: 1000)]
    //Retornando número de linhas na tabela
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return itens.count
    }
    //Criando e retornando uma célula
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell=UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)
        cell.textLabel?.text=itens[indexPath.row].name
        return cell
    }
    //Função que vai implementar o comportamento de quando uma linha é selecionada
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        cell?.accessoryType = UITableViewCellAccessoryType.checkmark
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //Swift força todas as variavéis a terem um valor inicial. Essa variavél do campo de texto só vai ter valor em tempo de execução, mas não de compilação. Então colocamos uma exclamação pra dizer ao compilador que ela é opcional. Dizemos ao compilador para confiar no programador.
    @IBOutlet var nameField:UITextField?
    @IBOutlet var happinessField:UITextField?
    //Criando uma referência para a interface que assina o método add da tabela
    var delegate : ViewControllerDelegate?
    @IBAction func addFood(){
        if( nameField == nil || happinessField == nil){
            return
        }
        let name:String=nameField!.text!
        if let happiness=Int(happinessField!.text!){
            let meal=Meal(name:name, happiness: happiness)
            print("Eu comi \(meal.name) e minha felicidade foi \(meal.happiness)")
            //Testando a referência é válida
            if(delegate == nil) {
                return
            }
            //Chamando a função que adiciona a refeição no array do controller
            //da tabela
            delegate!.addMeal(meal)
        }
        //Tirando a última view do stack
        navigationController?.popViewController(animated: true)


    }
}
7 respostas

Só pra deixar claro, já tentei dessa forma também:

cell!.accessoryType = UITableViewCellAccessoryType.checkmark

Tentei copiar e colar essa função na classe MealsTableController, funcionou normalmente. Então tentei herdar da classe UITableViewController na classe ViewController, mas dá erro de compilação pois o swift não permite herdar de UITableViewController e UIViewController ao mesmo tempo.

Bem, foram essas minhas tentativas de resolução, todas sem sucesso.

Bom dia Italo,

Você pode confirmar que a função está sendo invocado? Tem duas maneiras simples sempre que seu código não parece agir com a sua alteração, uma é colocar o breakpoint, e outra é colocar uma mensagem de log antes da linha a ser executada. Colocando a mensagem de log e rodando você vai conseguir isolar e entendemos melhor o problema:

  • se a msg antes da linha de mudar o accessory aparecer o problema está na linha do accessory
  • se a msg não aparecer, seu UITableViewDelegate tem algum problema de não estar configurado para essa tabela

O principal é sempre usar esse tipo de técnica para isolar seu problema: configuração e não chega lá OU configurado ok, chega lá mas a linha não está causando o efeito desejado. Pela sua descrição sem ver o visual da configuração do delegate acredito que não esteja configurado o delegate. Se for isso, no vídeo essa configuração é mostrada aos 2:37.

[]s

Já fiz isso. A função sequer é chamada. Nenhum log que coloco aparece no console.

Bom dia Italo, você consegue compartilhar a foto da configuração visual dos seus outlets como no vídeo? Você pode selecionar o seu TableView e ai ir na parte de Outlets, devem ter duas outlets preenchidas, pode compartilhar o screenshot via o imgur como eu fiz aqui; https://imgur.com/a/3t98pPl

Att

Segue a imagem pedida: https://imgur.com/gallery/DeciFqt

Oi Italo,

Além de criar os outlets dos elementos da TableView, é necessário implementar o protocolo de UITableViewDelegate.

Você pode pegar o outlet da sua table view e setar da seguinte forma:

tableView.delegate = self

Isso permite que você implemente o método:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

}

Sempre que você selecionar uma célula da TableView esse método será chamado.

Confere se você implementou dessa forma... qualquer coisa me avisa aqui novamente ;)

Abraço!

Desisti, resolvi baixar o projeto a partir desse ponto e continuar seguindo as aulas.