Mettre à  jour une donnée dans 2 vues

heliohelio Membre
octobre 2015 modifié dans API UIKit #1

Bonjour à  tous,


 


Je souhaiterais avoir vos conseils sur la mise en place d'une fonctionnalité dans mon application, voici les explications :


j'ai donc une tableviewcontroller dans laquelle les données proviennent d'une API, une liste d'objet avec la quantité. En cliquant sur la cellule on obtient le détail de l'objet dans une vue detailViewController avec notamment la quantité mais aussi d'autres informations. Sur cette écran je souhaite mettre à  jour la quantité, dans l'api une requête est disponible pour réaliser cela. Toutes les données dans detailViewController sont transmises par la fonction prepareForSegue de tableViewController.


 


Donc comment procéder pour la mise à  jour de la donnée quantité à  partir de detailViewController afin qu'elle soit actualisée dans les 2 vues (tableviewcontroller et detailViewController) sachant que les données sont parsées dans tableviewcontroller?


Merci de votre aide


Réponses

  • DrakenDraken Membre
    octobre 2015 modifié #2

    MVC ...


     


    M : Modèle de données


    V : Vue


    C : Controleur 


     


    Un Modèle peut être accessible par plusieurs controleurs. 


    Concrétement cela veut dire que tu dois créer un objet spécifique pour parser tes données, et fournir un lien à  tes deux contrôleurs pour qu'ils puissent l'utiliser.


     


    Tu peux aussi créer un petit objet modèle commun aux deux contrôleurs pour communiquer les informations.


     


    Le sujet a déjà  été abordé dans ce topic :


     


    http://forum.cocoacafe.fr/topic/13849-résolu-transmission-de-variables-au-sein-des-pages-dun-uipagviewcontroller/?p=133162


  • Salut,


    j'ai dû laisser tomber pendant quelques temps le développement de mon application.


    Je commence à  m'y remettre, merci pour la réponse.


     


    Si je comprends bien il va falloir que j'appelle l'objet spécifique (qui parse les données) à  chaque fois que l'utilisateur passe de la TableView vers la detailView (et inversement), car s'il a modifié la quantité dans la détailView il faut que je l'actualise dans la TableView.


     


    Merci.


  • Tu peux aussi utiliser des notifications.


  • CéroceCéroce Membre, Modérateur
    novembre 2015 modifié #5

    Disons que sur iPhone, on n'a qu'une TableView par écran, donc en général, il n'y a pas besoin de prévenir qu'on a changé les données, puisque la deuxième TableView va de toute façon aller chercher les données lors de son affichage. Sur iPad, c'est différent, parce que deux tables peuvent effectivement être à  l'écran en même temps.


  • @Geoffrey tu pourrais m'expliquer comment utiliser les notifications.


     


    Merci à  vous 


  • Tu devrais regarder les tutos de ma signature. Voici la session  traitant des notifications :


     


    http://pagesperso.lip6.fr/Fabrice.Kordon/5I452-2014/semaine-10.php

  • Bonjour à  tous,


    J'ai ragardé des tutos sur les notifications, c'est intéressant mais je n'arrive pas à  réaliser ce que je souhaite.


    En effet, il faudrait que je puisse faire ceci :


    - dans la detailViewController lorsque je modifie la quantité, que la cellule soit modifiée de suite, la modification concerne l'ajout d'une petite icone (UIImage) 


    - lorsque que je fais un retour sur la vue précédente (une tableViewController avec la liste des objets), que la cellule soit modifiée également avec l'ajout de l'icone


     


    j'utilise ceci :



    NSNotificationCenter.defaultCenter().addObserver(self, selector: "updateQty", name: mySpecialNotificationKey, object: nil)

    ensuite lors du clic que sur la modification de la quantité 



    NSNotificationCenter.defaultCenter().postNotificationName(mySpecialNotificationKey, object: self)

    puis je parse les données pour tenter de les mettre à  jour mais cela ne fonctionne pas



    func updateQty() {

    BParser.bParsing(pID, Qty: self.sQty)


         self.tableView.reloadData()


    }


    Merci de votre aide.

  • Bonjour,


     


    C'est un peu dur de t'aider comme ça :).


    Si ton but est de voir la modification sur ton objet dans deux vues différentes, il suffit d'utiliser le même objet avec la même référence.


     


    Exemple :



    @interface Produit : NSObject
    @property (nonatomic, strong) NSNumber *quantite;
    @end

    @implentation Produit
    @end

    @interface ProduitViewController : UITableViewController
    @property (nonatomic, strong) Produit *produit;
    @end

    @implementation ProduitViewController 

    // Quelques part dans ton code
    DetailViewColtroller *detailVC = ...

    //Ici on passe le même objet produit vers le détail view controller, donc toute modification de cet objet
    //dans le détail controller vas être visible dans le Produit view controller, puisque c'est le même objet 
    detailsVC.produit = self.produit;

    [self.navigationController pushViewController:detailVC animated: YES];
    .....


    - (void)viewWillAppearAnimated:(BOOL)animated {
         [super viewWillAppearAnimated:YES]

     // Tu rafraichie ta vue, c'est ici que tu peux voir par exemple l'objet produit si a été modifié ailleur }

    @end

    Sinon montre plus ton code pour voir comment tu fais et que les autres puissent t'aider plus précisément. 


  • J'ai l'impression que tu as une relation 1 To 1 et je pense qu'il est plus judicieux d'opter pour les délégués par exemple.


     


    Les lignes que tu mets à  disposition sont placées ou très exactement ?


  • heliohelio Membre
    décembre 2015 modifié #11

    Pour rappel :


    - TableViewController (liste des produits avec icone quantité sur la cellule) -> DetailViewController (détail complet du produit avec avec quantité également)


    - Les données sont issues d'une API, pour mettre à  jour la quantité je fais appel à  une API et cela se passe dans le detailViewController


     


    En réalité la mise à  jour de la quantité fonctionne mais je suis obligé de reparser les données lorsque je fais retour sur la liste des produits TableViewController, c'est-à -dire lorsque je passe de DetailViewController (où je mets à  jour la quantité) à  TableViewController, ce que ne font pas la plupart des applications, c'est cela qui me gêne.


     


    C'est un peu ce genre de demande : 


     


    http://stackoverflow.com/questions/13437136/how-to-update-masterviewcontroller-item-cell-from-detailviewcontroller


    http://stackoverflow.com/questions/10578281/how-to-pass-data-back-from-detail-view-controller-to-uitableview


     


    mais avec l'API au milieu !


  • Bonsoir,


    J'y suis arrivé, enfin !


    Je vais pouvoir avancer, certainement d'autres questions à  venir...


    Merci à  tous.

  • Joanna CarterJoanna Carter Membre, Modérateur

    Bonsoir,

    J'y suis arrivé, enfin !




    Pour que les autres puissent profiter, s'il te plaà®t nous dire comment tu t'es arrivé ?
  • heliohelio Membre
    décembre 2015 modifié #14

    Oui alors j'ai créé une classe avec des méthodes dont une méthode qui parse mes données.


    Dans DétailViewController, lors du clic sur Ajout dans le stock :


    - je mets à  jour la quantité (API)


    - je fais appel à  la méthode qui parse mes données


    - j'envoie une notification par 



    NSNotificationCenter.defaultCenter().postNotificationName(mySpecialNotificationKey, object: self)

    Dans TableViewController, et plus particulièrement dans viewWillAppear, je récupère les données et je les recharge dans la tableView :



    override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    let produit = produit.init()
    self.posts = produit.retourData()

    self.tableView.reloadData()

    }

    Dans viewDidLoad, je récupère la notification qui va me permettre d'effacer toutes les données de la tableView sinon on se retrouve avec le double de données car elles ont été chargées la première fois qu'on est passé sur TableViewController :



    NSNotificationCenter.defaultCenter().addObserver(self, selector: "actOnSpecialNotification", name: mySpecialNotificationKey, object: nil) 


    func actOnSpecialNotification() {
    self.posts.removeAllObjects()

    Merci.


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