Passer une info dans container

2»

Réponses

  • InsouInsou Membre
    février 2017 modifié #32

    Pour stocker une variable, j'utilise ça : 



    // Sauvegarder une valeur via une clé
    let defaults = UserDefaults.standard
    defaults.set(deviceTokenString, forKey: "MaVariable")

    // retrouver une valeur via une clé
    let defaults = UserDefaults.standard
    print(defaults.value(forKey: "MaVariable"))

    // Edit :


    Si c'est pour palier à  ton soucis, tu devrais plutôt essayé de le résoudre au lieu de trouver une rustine ^^


  • Joanna CarterJoanna Carter Membre, Modérateur


    je voudrais stocker l'id du produit pour l'utiliser après dans la vue NewstTableViewController .


    je comprend pas cela devrais fonctionner de passer l'id d'une vue a une autre.


     


    On ne peux le faire que pour une seul vue pas plusieurs.




     


    Du coup, on met la var en optional sur le NewstTableViewController et tester pour nil avant de l'utiliser


     


    C'est pas conseillé de utiliser ni les globales, ni NSUserDefaults, pour telle circonstance

  • Joanna CarterJoanna Carter Membre, Modérateur


    Il n'y aurait pas un moyen de créer une Enum contenant tous les noms des segues que nous pourrions utiliser directement dans XIB et dans les différentes UIViewController ? Une faute de frappe est si vite arrivée... De plus, si un jour pour X raison le nom devait changer (que nous mettrions dans un attribut code de l'Enum), nous aurions uniquement à  le modifier à  un seul endroit.




     


    Il y a une article très intéressante sur les enums pour les segues https://www.natashatherobot.com/protocol-oriented-segue-identifiers-swift/


     


    Mis, on ne peut pas encore utiliser les enums dans les storyboard. Au moins, on ne saisie le nom qu'en deux endroits ; on peut le copier/coller de l'ennui vers le storyboard.

  • easydeasyd Membre
    février 2017 modifié #35

    je vais tous reprendre, je comprend pas.


     


    J'ai deux vue avec l'utilisation d'un ID pour faire du JSON.


     


    j'essaie comme cela 



    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard let cell = sender as? UITableViewCell,
    let indexPath = self.tableView.indexPath(for: cell),
    let selectedPerson = searchResults[indexPath.row]["id_produit"].string else
    {
    return
    }

    if segue.identifier == "showDetail23",
    let personViewController = segue.destination as? NewstTableViewController
    {

    personViewController.TabInfos = selectedPerson
    print("TabInfosddd2222", personViewController.TabInfos)


    return
    }

    }

    ça fonctionne pas


     


    Et cela



    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard let cell = sender as? UITableViewCell,
    let indexPath = self.tableView.indexPath(for: cell),
    let selectedPerson = searchResults[indexPath.row]["id_site_fnaim2"].string else
    {
    return
    }

    if segue.identifier == "showDetail22",
    let personViewController = segue.destination as? InfoSearchTableViewController
    {
    personViewController.TabInfos = selectedPerson
    print("TabInfosddd", personViewController.TabInfos)
    }

    }


    ça fonctionne


     


    je comprend pas si je retire l'un ou l'autre ça fonctionne pas ou ça fonctionne.


     


    Là  je sais pas quoi faire, je perd la tête.


     


    Quelqu'un aurait une idée.


     


    ou stocker cela dans un BDD local.


    je clique sur mon choix sur la vue ça stock l'ID, quant je l'utilise, puis quant je quite la vue ça efface l'iD ou la BDD.


     


    je tourne, je cherche, un S.O.S, une bouteille a la mer.

  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #36

    Bien. Tu as un segue avec l'identifiant "showDetail23" et la destination est un NewstTableViewController ? ça devrait aller. C'est quoi ton problème ?


  • showDetail23 oui j'ai bien cela mais mon 


     


    print("TabInfosddd2222", personViewController.TabInfos)


     


    IL est vide il y a rien pas de ID


  • Joanna CarterJoanna Carter Membre, Modérateur

    Donc, le code passe par la ligne print(...) et tu peux voir le résultat dans le console ?


  • print("TabInfosddd2222", personViewController.TabInfos)


     

     

    je voie rien même pas la ligne s'affiche, j'ai l'impression quel est pas utiliser, InfoSearchTableViewController lui fonction.

     

    dans ma class 

     



    NewstTableViewController: UITableViewController {

    var TabInfos = String()

    override func viewDidLoad() {
    super.viewDidLoad()

    let idLabel = TabInfos
    print("dddd2:",TabInfos)

    ....

    print("dddd2:",TabInfos) et vide 


    dans la console j'ai que cela dddd2:


     



     

  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu as mis les breakpoints dans le code ?


     


    Si oui, est-ce que le débogueur s'arrête ?



    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard let cell = sender as? UITableViewCell,
    let indexPath = self.tableView.indexPath(for: cell),
    let selectedPerson = searchResults[indexPath.row]["id_site_fnaim2"].string else
    {
    return
    }

    // breakpoint ici

    if segue.identifier == "showDetail22",
    let personViewController = segue.destination as? InfoSearchTableViewController
    {
    personViewController.TabInfos = selectedPerson // breakpoint ici
    }
    }
  • Je crois que j'ai compris le breakpoint fonctionne mais quant je déplace cette breakpoint il ne charge pas le ID  parce que, je passe par une autre vue qui ce trouve dans un containaier view.


     


    Voilà  une image de ce que je veux faire et containaier view est un Table view cell


     


     


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #42

    Alors, quand le débogueur s'arrête sur le premier breakpoint, si tu tapes :



    po selectedPerson

    ... dans le console, qu'est-ce que tu as ?


  • Bonjour tous le monde,


     


    Je vient de faire le teste breakpoint po selectedPerson et constater qu'il saute l'étape la 1er breakpoint.


     


    J'ai fait cela 


     


    breakpoint  personViewController.TabInfos = selectedPerson (le 1er)


    breakpoint  personViewController.TabInfos = selectedPerson (le 2ème)


     


    Quant je pause mon pointeur sur le selectedPerson j'ai un résultat (ID) mais quant je pause sur TabInfos j'ai rien info.


     


    Et si j'utiliser CORE DATA pour stocker l'information (ce week-end) j'ai regarder cela.


     


    Merci de votre aide,


     


  • Joanna CarterJoanna Carter Membre, Modérateur
    février 2017 modifié #44

    Donc, le débogueur s'arrête sur la ligne :



    personViewController.tabInfos = selectedPerson

    ça te dit que selectedPerson n'est pas nil.


    Mais le code dans le viewController ne fait ce que tu crois :

     



    class NewstTableViewController: UITableViewController
    {
    var TabInfos = String()

    override func viewDidLoad()
    {
    super.viewDidLoad()

    let idLabel = TabInfos

    print("dddd2:",TabInfos)

    ....

    viewDidLoad est appelé avant que prepare(for segue) est appelé. Du coup, tabInfos est toujours un String vide.


    Il faut mettre à  jour idLabel dans le didSet de la var tabInfos :



    class NewstTableViewController: UITableViewController
    {
    @IBOutlet weak var idLabel: UILabel!

    var tabInfos = String()
    {
    didSet
    {
    idLabel.text = tabInfos
    }
    }


    ....

    Oh, et n'utilises pas les majuscules pour commencer les noms des vars  :-*


  • toujours le même problème,


     


    On dirait que ça ne passe pas sur NewstTableViewController pas d'id.


    Je ne comprend plus rien.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu as mis un breakpoint dans le didSet de la var tabInfos ?


  • Je vient de la faire rien, rien on dirait que ca ne va pas sur NewstTableViewController.


     


    mais quant je met un ID en dure ca affiche bien ce que je veux.


  • Joanna CarterJoanna Carter Membre, Modérateur

    S'il te plaà®t répondre à  mes questions plus précisément.


     


    1. as-tu mis un breakpoint dans le didSet de la var tabInfos ?


     


    2. le débogueur, s'arrête il là  ?


     


    3. quelle est la valeur de tabInfos là  ? (saisir " po tabInfos " dans le console)


  • S'il te plaà®t répondre à  mes questions plus précisément.


     


    1. as-tu mis un breakpoint dans le didSet de la var tabInfos ?


    Oui j'ai mis un breakpoint dans didSet.


     


    2. le débogueur, s'arrête il là  ?


    Non il ne s'arrête pas là .


     


    3. quelle est la valeur de tabInfos là  ? (saisir " po tabInfos " dans le console)


    IL y a rien


  • Joanna CarterJoanna Carter Membre, Modérateur

    Tu peux nous montrer tous le code des deux contrôleurs ? Et n'oublies pas d'utiliser les balises code  8--)


  • Voila 1er code



    import UIKit
    import SwiftyJSON

    class SearchResultsTableViewController: UITableViewController {

    @IBOutlet weak var menuButton:UIBarButtonItem!

    var tabInfos = String()

    var searchResults = [JSON]() {
    didSet {
    tableView.reloadData()
    }
    }

    var validatedText: String {
    return searchController.searchBar.text!.replacingOccurrences(of: " ", with: "").lowercased()
    }

    let searchController = UISearchController(searchResultsController: nil)
    let requestManager = RequestManager()

    override func viewDidLoad() {
    super.viewDidLoad()


    searchController.searchBar.delegate = self
    searchController.dimsBackgroundDuringPresentation = false
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.searchBar.placeholder = "Search ..."
    definesPresentationContext = true
    tableView.tableHeaderView = searchController.searchBar
    searchController.searchBar.sizeToFit()

    NotificationCenter.default.addObserver(self, selector: #selector(SearchResultsTableViewController.updateSearchResults), name: NSNotification.Name(rawValue: "searchResultsUpdated"), object: nil)

    if revealViewController() != nil {
    menuButton.target = revealViewController()
    menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    }

    func updateSearchResults() {
    searchResults = requestManager.searchResults
    }

    override func numberOfSections(in tableView: UITableView) -> Int {

    return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

    return searchResults.count
    }


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "itemCell", for: indexPath)

    cell.textLabel?.text = searchResults[indexPath.row]["nom_agence"].stringValue
    cell.detailTextLabel?.text = searchResults[indexPath.row]["id_produit"].stringValue

    if indexPath.row == searchResults.count - 10 {
    if requestManager.hasMore {
    requestManager.getNextPage(validatedText)
    }
    }

    return cell
    }

    deinit {
    NotificationCenter.default.removeObserver(self)
    }


    override func prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
    guard let cell = sender as? UITableViewCell,
    let indexPath = self.tableView.indexPath(for: cell),
    let selectedPerson = searchResults[indexPath.row]["id_produit"].string else
    {
    return
    }

    if segue.identifier == "showDetail23",
    let personViewController = segue.destination as? NewstTableViewController
    {


    personViewController.tabInfos = selectedPerson
    print("TabInfosddd2222", personViewController.tabInfos)

    return
    }

    if segue.identifier == "showDetail22",
    let personViewController = segue.destination as? InfoSearchTableViewController
    {
    personViewController.tabInfos = selectedPerson
    print("TabInfosddd", personViewController.tabInfos)
    }

    }

    }

    extension SearchResultsTableViewController: UISearchBarDelegate {
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

    requestManager.resetSearch()
    updateSearchResults()
    requestManager.search(validatedText)
    }
    }

    mon deuxième code :



    import UIKit
    import Alamofire

    class NewstTableViewController: UITableViewController {

    @IBOutlet weak var idLabel: UILabel!

    var tabInfos = String()
    {
    didSet
    {
    idLabel.text = tabInfos
    }
    }

    var _personList:[[String:AnyObject]] = []

    override func viewDidLoad() {
    super.viewDidLoad()

    let idLabel = tabInfos
    print("dddd2:",tabInfos)

    Alamofire.request("http://serveur/api/searchinfoAvis.php?rechercheinfo=\(idLabel)")
    .validate()
    .responseJSON { (response) in
    if response.result.isSuccess {
    self._personList = response.result.value as! [[String:AnyObject]]
    print(self._personList)
    self.tableView.reloadData()
    } else {
    print(response.result.error!)
    }
    }

    /*
    if revealViewController() != nil {
    menuButton.target = revealViewController()
    menuButton.action = #selector(SWRevealViewController.revealToggle(_:))
    view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())
    }
    */

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    }

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell:NewtTableViewCell! = tableView.dequeueReusableCell(withIdentifier: "contact_cell") as! NewtTableViewCell

    let person:[String:Any] = _personList[indexPath.row]
    cell.display(person: person as [String : AnyObject])

    return cell
    }

    }

    Voilà ,


  • Joanna CarterJoanna Carter Membre, Modérateur

    En regardant le code, à  part des fautes de logique, je ne peut rien voir d'évident. Si c'est un tout petit projet, tu veux me l'envoyer par MP en pièce-jointe ?


  • Coucou, je vient de t'envoyer en MP mon code,


     


    Merci encores de ton aide,


  • Joanna CarterJoanna Carter Membre, Modérateur

    Voilà  ! Ce n'est pas étonnant que tu as les soucis  ::)


     


    Côté le segue "showDetail22"

    1.png 7.2K
    2.png 30.5K
  • Joanna CarterJoanna Carter Membre, Modérateur

    Et, dans NewstTableViewController :



    class NewstTableViewController: UITableViewController
    {
    var tabInfos = String()

    override func viewDidLoad()
    {
    super.viewDidLoad()

    let idLabel = TabInfos

    Alamofire.request("http://sentissia.hopto.org/ios_app/api/searchinfoAvis.php?rechercheinfo=\(idLabel)")

    Pourquoi idLabel ? Tu as déjà  tabInfos dans la var en-dessus.


     


    Quand-même, tu appelles la requête avec un String qui est vide. Ce code devrait être, au moins, dans le didSet de tabInfos :



    class NewstTableViewController: UITableViewController
    {
    var personList:[[String:AnyObject]] = []

    var tabInfos = String()
    {
    didSet
    {
    Alamofire.request("http://sentissia.hopto.org/ios_app/api/searchinfoAvis.php?rechercheinfo=\(tabInfos)")
    .validate()
    .responseJSON
    {
    (response) in

    if response.result.isSuccess
    {
    self._personList = response.result.value as! [[String:AnyObject]]

    print(self._personList)

    self.tableView.reloadData()
    }
    else
    {
    print(response.result.error!)
    }
    }
    }
    }

    Avec ça, tu peux supprimer viewDidLoad()


  • Merci beaucoup de ton aide Joanna,


     


    Je vient de finir mon application.


     


    Je vais faire quelques tests et finir ma BDD.


    Puis revoir mon code et le commentaires.


     


    Merci vous, cela ma permit de comprendre beaucoup de chose.


     


    Merci encore,


  • Excuse-moi,


     


    Une dernière question comment fait-on pour rafraichie mon code, je m'explique quant passe d'un storyboard a un autre.


    Et quant je revient en arrière je voudrais recharger mon code , il ne le fait pas.


     


    Merci pour cette dernière question (promit ::) )

Connectez-vous ou Inscrivez-vous pour répondre.