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

prepareForSegue Fail :^(

Olá,

Lendo outros posts deu para perceber que outros colegas passaram pelo mesmo problema que estou passando agora: "Incompatibilidade de versões do Swift". Essa incompatibilidade de versão fez com que o ensinamento repassado pelo vídeo caísse em desuso.

Ao colocar:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "addMeal" {
            let view = segue.destinationViewController as ViewController
            view.delegate = self
        }
    }

O compilador retorna um erro dizendo que o retorno do método destinationViewController não é um ViewController e nos força colocar um sinal de exclamação apos a palavra reservada "as".

Implementando a inscrição dada pelo compilador e executando o código, após apertar o botão "Add" do formulário o objeto criado "meal" não é listado na view da tabela.

Gostaria de uma solução para contornarmos esse problema de compatibilidade de sintaxe entre versões para eu dar continuidade no curso. Gostaria que algum professor disponibilizasse um código explicativo que contorna essa situação.

Logo abaixo está o código do ViewController e da MealsTableViewController.

import UIKit

class MealsTableViewController: UITableViewController {

    var meals = [Meal(name: "Baião de dois", happiness: 5),
                 Meal(name: "Pão com ovo", happiness: 4)]


    func add(meal: Meal) {
        meals.append(meal)
    }

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return meals.count
    }


    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let row = indexPath.row
        let meal = meals[row]

        let cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)

        cell.textLabel!.text = meal.name

        return cell
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "addMeal" {
            let view = segue.destinationViewController as! ViewController
            view.delegate = self
        }
    }
}
import UIKit

class ViewController: UIViewController {

    @IBOutlet var nameField: UITextField?
    @IBOutlet var happinessField: UITextField?
    var delegate: MealsTableViewController?

    @IBAction func add() {
        if nameField == nil || happinessField == nil {
            return
        }

        let name = nameField!.text
        let happiness = Int(happinessField!.text!)

        if happiness == nil {
            return
        }

        let meal = Meal(name: name!, happiness: happiness!)

        if delegate == nil {
            return
        }

        delegate!.add(meal)

        print("Eaten: \(meal.name) \(meal.happiness)")

        if let navigation = self.navigationController {
            navigation.popViewControllerAnimated(true)
        }

    }
}
8 respostas

Fala aí Leandro, realmente com as novas versões do Swift algumas coisas mudaram e acabaram quebrando alguns códigos.

Vou tentar implementar seu código aqui e ver o porque ele não está adicionando na listagem.

Ok :^D

Acho que o curso precisa ser refeito em Swift 3.0

o/ I agree!

Ainda mais que meu foco é especializar em iOS... Vou procurar algo alternativo nessa área.

solução!

Fala aí Leandro, só consegui testar agora seu código.

Peguei sua classe para testar e aparentemente está ok seu código, mas acho que faltou recarregar os dados da tableView.

Em algum momento na classe MealsTableViewController você está recarregando o objeto tableView dessa forma self.tableView.reloadData()?

caso tenha dúvida de como implementar isso, avisa aí :)

Realmente o meu problema foi que não adicionei o

self.tableView.reloadData()

Resovido! O app está executando normalmente.

Muito obrigado.

A funções 'prepareForSegue' e também o modo de sintaxe 'segue.destinationViewController as ViewController' foram depreciadas na versão 3. Segue o código subscrito

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if(segue.identifier == "addMeal") { let view = segue.destination as? ViewController view!.delegate = self } }