6
respostas

Prepare for segue

Depois que eu escrevo esse código aparece um monte de erros.

Esse código é compatível com o Swift 4?

Grata, Veronica

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let view = segue.destination
    view.mealsTable = self
6 respostas

Oi Veronica, tudo bem ?

Devia estar funcionando sim.

Só um ponto para você ter uma vaga noção, pode estar com problemas se você não criar a propriedade mealsTable na view que quer manipular.

Olá Matheus,

Nao sei sei o meu problema é no prepare for segue ou no navigation controller. O app roda, mas quando clico no add aparece isso:

Cardapio`main:
    0x103c37f80 <+0>:  pushq  %rbp
    0x103c37f81 <+1>:  movq   %rsp, %rbp
    0x103c37f84 <+4>:  subq   $0x20, %rsp
    0x103c37f88 <+8>:  movl   %edi, -0x4(%rbp)
    0x103c37f8b <+11>: movq   %rsi, -0x10(%rbp)
    0x103c37f8f <+15>: callq  0x103c37e20               ; type metadata accessor for Cardapio.AppDelegate at AppDelegate.swift
    0x103c37f94 <+20>: movq   %rax, %rdi
    0x103c37f97 <+23>: callq  0x103c383c0               ; symbol stub for: NSStringFromClass
    0x103c37f9c <+28>: movq   %rax, %rdi
    0x103c37f9f <+31>: callq  0x103c384e6               ; symbol stub for: objc_retainAutoreleasedReturnValue
    0x103c37fa4 <+36>: xorl   %ecx, %ecx
    0x103c37fa6 <+38>: movl   %ecx, %edx
    0x103c37fa8 <+40>: movl   -0x4(%rbp), %edi
    0x103c37fab <+43>: movq   -0x10(%rbp), %rsi
    0x103c37faf <+47>: movq   %rax, %rcx
    0x103c37fb2 <+50>: callq  0x103c383c6               ; symbol stub for: UIApplicationMain
    0x103c37fb7 <+55>: xorl   %edi, %edi
    0x103c37fb9 <+57>: movl   %eax, -0x14(%rbp)
    0x103c37fbc <+60>: movl   %edi, %eax
    0x103c37fbe <+62>: addq   $0x20, %rsp
    0x103c37fc2 <+66>: popq   %rbp
    0x103c37fc3 <+67>: retq

O meu app esta aqui: https://github.com/verosegal/Cardapio

Grata, Veronica

Bom dia Veronica!

Stacktrace de execução é sempre difícil de desvendar mesmo.

Não achei o arquivo comitado no github, parece que só está o projeto vazio, pode comitar o projeto atual completo para darmos uma olhada? Se quiser se adiantar, posta aqui o arquivo inteiro também.

Tenho duas suspeitas comuns para esse tipo de erro de execução, quando o compilador aceita tudo mas execução estoura erro no segue:

a) o compilador pirou temporariamente (infelizmente acontece), fecha o projeto e abre novamente, altera alguma linha de codigo qualquer, escrevendo qualquer coisa, forçando ele a buildar novamente e ve se ele detecta algum erro que ele não havia detectado antes. o compilador do swift está cada vez melhor mas ainda tem vezes em que ele se perde. sempre faço isso quando tenho algum erro inesperado em execução

b) o erro mais comum em execução é uma variável opcional não estar setada e tentarmos acessá-la. isto é, pega uma variável membro como a mealsTable. Se tentarmos acessar ela antes de atribuir valor a ela, vai dar erro em execução, mas não em compilação. Pode ser isso, mas só olhando o código das várias classes para entender a ordem de execuçnao (primeiro atribuiu, depois acessou)

[]s

Como isso esta acontecendo quando clico no add da primeira pagina. vou colocar aqui o código do mealstalble.

Grata, Veronica

//
//  MealsTableViewController.swift
//  Cardapio
//
//  Created by Veronica Segal on 08/10/17.
//  Copyright © 2017 Veronica Segal. All rights reserved.
//

import UIKit

class MealsTableViewController : UITableViewController, AddAMealDelegate {

    var meals = [Meal(name: "Pizza", happiness: 5), Meal(name: "Sufle", happiness: 5), Meal(name: "Cocada", happiness: 3),
     Meal(name:"Brigadeiro", happiness: 5),
     Meal(name: "Beijinho", happiness: 4)]

    func add(_ meal:Meal) {
    print("adding \(meal.name)")
    meals.append(meal)
    tableView.reloadData()
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if(segue.identifier == "addMeal") {
            let view = segue.destination as! ViewController
            view.delegate = self
        }
    }
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return meals.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let row = indexPath.row
    let meal = meals[row]
    let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: nil)
    cell.textLabel!.text = meal.name
    return cell
    }
}

Aparece essa mensagem enquanto o xcode buildando o app dai ele abre e eu clico em add dai que crasheia.

https://pasteboard.co/GPnO8ZQ.png

Ótimo Veronica! Com o código conseguimos correr atrás do erro juntos. Sempre que temos um erro temos que analisar um passo por vez, para achar o problema. Erros são pequenas vírgulas no código que é difícil achar a olho nu. Isso pq se fossem coisas muito fáceis de achar... já teríamos achado :)

Então sempre que encontramos um erro que não estamos solucionando facilmente ensino os alunos que temos que parar, respirar, e isolar o código. Você já percebeu que o erro é quando clica no botão add. Ótimo. O que o botão add faz? Vamos ver no código.... são três linhas de código certo?

  • imprime algo
  • chama um método
  • chama outro método

Então podemos assumir que o erro está acontecendo em um desses três. Podemos usar o debug para descobrir mas quando é pouca coisa dá para tentar isolar. Para isolar fazemos o seguinte: comenta as 3 linhas e roda.

Se você clicar no botão e não der erro, o erro realmente está em uma dessas três linhas. Repara que nnao vai adicionar nada, isso pq comentamos as linhas, mas pelo menos detectamos que o erro realmente está ai. Repara que é um processo cientifico e burocrático de detectar a causa do erro? Mas esse é nosso dia a dia... então vamos lá.

Vou assumir que qdo comentar as 3 linhas o código vai funcionar. Então agora resta saber qual das 3 está com problema. Descomenta a primeira, só ela. E roda novamente. Funcionou? Eu vou chutar que vai funcionar. Ela não faz nada de especial, não parece ter problema a olho nu. Mas lembro que olho nu engana, então é melhor testarmos isoladamente.

Se não funcionar nos avisa que podemos pensar o que pode ser.

Se funcionar vamos pra segunda linha. Mantendo a primeira linha descomentada, agora descomenta a segunda e roda. Funcionou? Faz a mesma coisa pra terceira linha.

Repara que com esse método você consegue isolar qualquer problema e isso é fundamental para o nosso dia a dia.

Assim que souber qual é a linha que está dando erro nos avisa? Ai corremos atrás do que pode ser que está causando ele.

O meu chute, a olho nu, é que seja a terceira linha o problema. Isso pq as duas primeiras linhas executam código ligado a variáveis que estão no mesmo código, e a olho nu não parecem ter problema. Mas, novamente, meu olho pode me enganar... então temos que testar e isolar o problema.

Assim que isolar nos avisa?

[]s