Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

addItem com erro simulado não funciona como exercicio

Quando removemos o link do tableView do ViewController para simular o erro na função 'add', é mostrado no exercicio que mesmo com a mensagem de erro, o item é adicionado no arraylist pois a execução não é bloqueado, o que podemos ver ao clicar em 'back', vendo o item adicionado na lista.

Porém ao realizar o mesmo procedimento no meu código o resultado foi diferente, onde o item não foi adicionado a tabela. Alguem teve o mesmo comportamento?

func add(item: Item) {
    items.append(item)
    if let table = tableView {
        table.reloadData()
    } else {
        let alert = UIAlertController(title: "Sorry",
            message: "Unexpected error, but the item was added.",
            preferredStyle: UIAlertControllerStyle.Alert)
        let ok = UIAlertAction(title: "Understood",
            style: UIAlertActionStyle.Cancel,
            handler: nil)
        alert.addAction(ok)
        presentViewController(alert, animated: true, completion: nil)
    }
}

A única explicação que encontrei é que no método em AddItemViewController que chama o 'add', existe um popViewController que é executado em seguida do 'showViewController', e ele popViewController está zerando os dados do 'ViewController' que guarda o arry de itens.

Alguma idéia?

4 respostas

Maurício,

Coloca esse seu código do AddItemViewController pra darmos uma olhada?

Abraço!

Fiz o debug aqui e vi que o item é adicionado no array, porém não há que eu faça que atualize a tabela sem o reloadData. Isso na verdade até faz um pouco de sentido, pois os métodos que constroem a tabela só são chamados na inicialização do controller, e depois disso deveria ser feito um reloadData nela, pois esse métodos não são chamados mais. Porém no exerício mostrado funcionou, por isso que entender porque não funciona no meu.

    @IBAction
    func addItem() {
        if (self.itemNameField == nil || self.caloriesField == nil) {
            return
        }

        if (self.itemNameField!.text == "") {
            return
        }

        var itemName = itemNameField!.text
        var calories = (caloriesField!.text as NSString).doubleValue

        let item = Item(name: itemName, calories: calories)

        println("item \(item.name), \(item.calories)")

        if let delegate = self.delegate {
            delegate.addItem(item)
            if let navigationController = self.navigationController {
                navigationController.popViewControllerAnimated(true)
            }
        }
    }
solução!

Mauricio,

Isso acontece pois houve uma mudança entre as versões do Swift e agora é necessário efetuar o reloadData manualmente.

Abraço!

OK

Percebi que muita coisa mudou desde a primeira versão do Swift para a atual iOS SDK 8.4.

Talvez fosse interessante atualizar o curso com pequenas informações sobre essas mudanças.

Obrigado