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
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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
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.
Ó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?
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