Bonjour Maxime et à tous,
Je suis actuellement en train de suivre le cours sur Udemy qui est d’ailleurs très bien fait et très bien structuré, merci pour cela!
En même temps je développe une application pour mes cours ( je suis en BTS et je dois développer une application pour mon diplôme ). Je dois donc faire une page de connexion, et un affichage dans un table view. Jusque là rien de bien compliqué. J’ai réalisé l’API en PHP et j’ai réussi à faire la connexion sans trop de problèmes. Cependant, je dois passé de ma vue numéro 1 ( espace de connexion ) le nom d’utilisateur et le mot de passe à la vue 2 ( affichage dans le table view ).
J’ai donc suivi le cours pour cela. Cependant j’ai un problème, dans son cours Maxime utilise un segue via le storyboard. Étant donné que je dois vérifier le login et le mot de passe de l’utilisateur je ne peux pas faire comme cela. J’ai donc fais comme ceci :
Dans la partie Passage des données entre mes deux vues je ne peux pas faire segue.destinationViewController car ce dernier a été remplacé par segue.destination apparement. Cependant cela ne fonctionne pas, mes variables récupèrent nil. Et avec des print j’ai remarqué que je ne passé pas dans ma fonction prepare.
Si vous pouviez m’aiguillez un petit peu ? Merci d’avance
Ce que tu doit faire c’est de crée 2 propriété dans ta vue 2 , on va l’appeler vue2ViewController.
Donc dans vue2ViewController:
var pseudo = String()
var mdp = String()
Maintenant dans ta fonction userConnect() tu la modifier comme ceci:
if let storyboard = self.storyboard{
Let destinationviewController = storyboard.instantiateViewController(withidentifier :“connectviewcontroller”) as! vue2ViewController
destinationViewController.pseudo = LePseudo (ici c’est une variable dans lequel tu aura stocker le pseudo biensur)
destinationViewController.mdp = LeMdp (idem)
show(destinationViewController,sender:nil)
}
BIensur ne pa oublier de remplacer vue2ViewController par le nom de ton viewController
Bien vu Samir! Je confirme, la fonction que je vous ai montrée prepareForSegue n’est utile qu’avec les segue. Puisque tu n’utilises pas de segue et que tu effectues manuellement la transition vers le prochain view controller, il te suffit de déplacer le code que tu avais mis dans ta fonction prepareForSegue vers ta fonction userConnect
C’est vrai qu’une fois que tu le dis c’est tout de suite logique… Merci beaucoup en tout cas !
Le soucis est que dans ma fonction userConnect lorsque je cast mon destinationViewController en ConnectViewController ( le nom de ma seconde vue ) j’arrive bien à accéder à mes variables mais lorsque je build mon appli, elle crache lorsque je clique sur le bouton… L’erreur que je récupère en console est la suivante :
Could not cast value of type ‘UINavigationController’ (0x1b3bae350) to ‘GsbFrais.ConnectViewController’ (0x1000eeaa0).
2017-04-17 10:25:32.451266+0200 GsbFrais[9255:2316172] Could not cast value of type ‘UINavigationController’ (0x1b3bae350) to ‘GsbFrais.ConnectViewController’ (0x1000eeaa0).
Je comprend donc que le problème vient du fait que j’utilise un navigationController mais je ne vois pas comment faire évoluer mon code pour éliminer cette erreur… Si quelqu’un à une idée je suis preneur.
L’erreur vien du fait que ton connectViewController est visiblement contenue dans un UInavigationController , donc pour que sa marche tu doi faire ceci:
if let storyboard = self.storyboard{
Let vc = storyboard.instantiateViewController(withidentifier :“connectviewcontroller”) as! UInavigationCOntroller
let destinationViewcontroller = vc.topViewController as! ConnectViewController
destinationViewController.pseudo = LePseudo (ici c’est une variable dans lequel tu aura stocker le pseudo biensur)
destinationViewController.mdp = LeMdp (idem)
show(destinationViewController,sender:nil)
}
Tien nous au courant
Salut,
Tout d’abord encore merci pour la réponse qui plus est si rapide!
D’accord je comprend l’erreur, cependant, j’ai cependant toujours une erreur et là je n’ai aucune idée d’ou ça peut venir…
2017-04-17 10:52:38.127959+0200 GsbFrais[9292:2326960] *** Terminating app due to uncaught exception ‘NSInvalidArgumentException’, reason: ‘Application tried to present modally an active controller <GsbFrais.ViewController: 0x100d0d3c0>.’
*** First throw call stack:
(0x18d85afd8 0x18c2bc538 0x193cfdfd0 0x193d008f8 0x193a7df74 0x193d04044 0x193d040b0 0x10009c0c0 0x10009c130 0x18e34f760 0x18d809a9c 0x18d8097a0 0x18d809060 0x18d806c84 0x18d736d94 0x18f1a0074 0x1939f2480 0x10009f66c 0x18c74559c)
libc++abi.dylib: terminating with uncaught exception of type NSException
Désolé j’étais un peu pris récemment! En tout cas merci, ça fonctionne nickel pour le moment! Je vais bosser toute la soirée et je reviendrais vers vous si vraiment je galère énormément sur quelque chose.
Encore merci et bonne soirée
Salut Samir,
J’essaie à mon tour de faire passer des données d’une vue à une autre… Et ça bloque.
J’ai un tableau de type objet qui se crée en remplissant 2 textfield.
j’ai implémenté la fonction prepare for segue, pour faire passé ce tableau vers une tableviewcontroller.
Quand je verifie si mon tableau contien quelque chose avant de faire appel à la fonction tout es nickel, apres c’est tout pourri…
Voici mon code apres avoir créé l’objet
Tkt on va essayer de voir sa. Xcode te donne quoi comme erreur ? Juste une petite chose est ce que ton UitableviewController n’est pas integrer a une uinavigationController ?
.)
Mon code compile, et à l’execution il ne genere aucune erreur… Par contre à l’affichage, le label de mon tableview affiche “0,0”, ce qui me laisse penser que la gestion de l’affichage est correcte mais que le passage de mon objet se fait mal ou ne se fait pas…
Pour répondre à ta question, je n’utilise pas de UINavigationController…
J’ai fait des test (à ma façon), et je sais qu’avant la fonction “prepare for segue”, mon objet “Article” est bien créé… Par contre quand je vérifie le contenu de la variable “monTableau” dans la fonction, les propriétés de mon objet son vide…
import UIKit
class ViewController: UIViewController {
// Déclaration des variables
var leProduit:[Article] = []
var resultat : Double = 0
var dep: Double = 0
var fin: Double = 0
var eco: Double = 0
@IBOutlet var txbPrixDep: UITextField!
@IBOutlet var txbPrixFin: UITextField!
var maListe: [Article] = [Article()]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// Fonction qui effectue le calcul
@IBAction func valider (sender: UIButton) {
dep = Double(txbPrixDep.text!)!
fin = Double(txbPrixFin.text!)!
resultat = dep - (dep * fin/100)
eco = dep - resultat
leProduit = [Article(dPrixDep: dep, dPrixFin: fin, dMontantEco: eco)]
}
// Transfert du tableau vers la tableview
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "donnees" {
let secondVewController = segue.destination as! PrixTableViewController
secondVewController.monTableau.append(Article(dPrixDep: self.dep, dPrixFin: self.fin, dMontantEco: self.eco))
}
}
//
}
Ma tableView
import UIKit
class PrixTableViewController: UITableViewController {
var monTableau : [Article] = []
override func viewDidLoad() {
super.viewDidLoad()
//print(monTableau.count)
/*for tab in monTableau {
print("prix du début : \(tab.prixDep) prix final : \(tab.prixFin) Economie : \(tab.montantEco)")
}*/
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Table view data source
/*override func numberOfSections(in tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return monTableau.count
}*/
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return monTableau.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "LaCellule", for: indexPath)
let article: Article = monTableau [indexPath.row]
// Configure the cell...
if let label = cell.textLabel {
label.text = String(article.prixFin)
}
return cell
}
}
Bon billy, ne voyant pas d’erreur dans ton code j’ai decider de copier tes source et de faire le meme projet que toi , j’en ai dédui la class Article , et ben figure toi que bizarement je n’ai pas d’erreur, la tableview affiche correctement l’objet.
Par contre on et bien d’accord que tu appui sur “valider” avant de changer de vue ? car la seul façon de trouver 0.00 et de changer de vue san executer l’ibaction “valider”.
Par curiositer tu pourrais me montrer ta class Article ?
Alors pour commencer tu (vous) pouvez m’appeler Williams qui est mon prénom…
Ensuite, tu es en train de dire que mon code fonctionne ???
Pour repondre à ta question, oui, ma « segue » part de mon bouton « valider » pour aller à ma tableview…
Voici ma classe Article
import Foundation
class Article {
// Propriétés
let prixDep: Double
let prixFin: Double
let montantEco : Double
init(dPrixDep: Double, dPrixFin: Double, dMontantEco: Double) {
prixDep = dPrixDep
prixFin = dPrixFin
montantEco = dMontantEco
}
/*init() {
prixDep = 0
prixFin = 0
montantEco = 0
}*/
//
}
Oui ton code fonctionne mais je pense que ta vue et appeler avan que la fonction “valider” s’execute du coup les propriete de tes object sont a zero. je te conseil de faire pluto un segue entre ton viewcontroller et prixtablrviewcontroller que tu peu appeler “donnees”. et rajouter a la fin de ta fonction " valider" ceci: