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
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