Creer un bouton "Ajouter au panier" dans un UITableViewController

MichelMichel Membre
juin 2014 modifié dans API UIKit #1

Bonjour a tous,


 


Je développe une application avec un backend sous Parse (parse.com). L'application se compose d'un UITableViewController qui affiche des produits (nom, description, photo) et d'un ViewController qui est un panier. A chaque ligne, j'ai un bouton "Ajouter" sur lequel l'utilisateur clique pour ajouter un produit a son panier.


 


Je suis en difficulté avec le bouton "Ajouter". Je n'arrive pas a l'implementer, je bloque dessus...


J'ai défini un NSObject MyItem qui représente un produit (nom, description, photo).


J'ai un NSObject CheckoutCart qui regroupe les fonctions de mon panier. Il contient entre autre la fonction addObject appelée addArticle qui me permet d'ajouter des objets de type MyItem a un tableau qui regroupe tous les articles. Puis j'affiche le tableau dans mon ViewController Panier.


 


Voici mon code :




- (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath object:(PFObject *)myObject
{
    MainTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@MyCustomCell]; 
    
    PFFile *thumbnail = [myObject objectForKey:@imageFile];
    cell.imageProduct.file = thumbnail;
    [cell.imageProduct loadInBackground];

    cell.nameLabel.text = [[myObject objectForKey:@nom] uppercaseString];
    cell.descriptionLabel.text = [myObject objectForKey: @description];

    NSLog(@Objet : %@", myObject); 
    return cell;
}

- (IBAction)buttonClick:(id)sender 
{    
    CheckoutCart* myCheckoutCart = [CheckoutCart sharedInstance];
    [myCheckoutCart addArticle:oneArticle];
}

En ajoutant le code ci-dessous dans mon IBAction, j'affiche bien "Velo de ville" et "Bleu avec un guidon vert" dans mon panier a chaque fois que je clique sur un des boutons "Ajouter". Donc la mécanique est bonne du cote du panier.



    MyItem *oneArticle = [[MyItem alloc] init];
    oneArticle.itemName = @Velo de ville;
    oneArticle.itemDescription = @Bleu avec un guidon vert;

Mais c'est la ou je bloque... Comment faire pour que oneArticle représente chaque objet myObject ?


Si vous pouviez m'aiguiller, ca serait sympa ! Merci !


Réponses

  • Bon, a priori, j'ai trouve un semblant de solution avec les tags... Mon message au dessus n'était pas très clair...


  • CéroceCéroce Membre, Modérateur
    Si ton message est clair, je suis déjà  tombé sur ce problème, mais je ne sais plus comment je l'avais réglé, et je n'ai pas mon code dans le coin...
  • samirsamir Membre

    Salut,


     


    Comment tu récupères la liste des objets que tu affiches dans ta cellules ? normalement tu vas avoir un array ou autre d'objet que tu affiches. Ensuite à  chaque click sur ta cellule :



    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // La tu a l'index sur lequel l'utilisateur a clické, donc tu connais l'index de l'objet ( article) correspondant a la cellule.
    tonArticleObjet = tonArrayQuiContientTestArticles[indexPath.row];

    // maintenant tu passe l'objet "tonArticleObjet" au panierViewController.
    }
  • CéroceCéroce Membre, Modérateur
    juin 2014 modifié #5
    @samir: non justement, la difficulté, c'est que ce n'est pas lors d'une tape sur la cellule, mais du bouton "Ajouter au panier".
  • Faire un contrôleur par ligne, serait-ce une hérésie ?
  • CéroceCéroce Membre, Modérateur

    Faire un contrôleur par ligne, serait-ce une hérésie ?

    C'est surtout inutile quand on utilise sa propre sous-classe de UITableViewCell... c'est elle qui peut devenir le contrôleur.

    Une idée: ta cellule contiendrait une propriété "article" pour lui passer l'article qui correspond au numéro de ligne. La cellule serait la cible de l'action du bouton. Dans la méthode d'action, tu peux alors appeler:
    -(void)addToCart:(id)sender
    {
    [[CheckoutCart sharedInstance] addArticle:oneArticle];
    }
  • MichelMichel Membre
    juillet 2014 modifié #8

    Alors avec un peu de retard, voici la solution que j'ai mise en place. J'utilise Parse.com pour mon backend, d'où quelques motifs dans le code :


     


    Dans TableViewController.m j'ai ajouté un tag à  chacun de mes boutons :



    - (UITableViewCell *)tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath (PFObject *)myObject {
    [...]   
    [cell.addButton addTarget:self action:@selector(addToCart:) forControlEvents:UIControlEventTouchUpInside;
    cell.addButton.tag = [indexPath row];
    }

    Dans TableViewController.m, j'ai crée une méthode pour appeler la fonction addToCart située dans mon objet CheckoutCart :




    - (void)addToCart:(UIButton *)button
    {
        PFObject *myObject = [self.objects objectAtIndex:button.tag];
        CheckoutCart* checkoutCart = [CheckoutCart sharedInstance];
        [checkoutCart addToCart:myObject];
    }


     

    Dans mon objet CheckoutCart, j'ai ma fonction addToCart. Elle ajoute chaque object dans un tableau "monArray"



    - (void)addToCart:(PFObject*)myObject {
        [self.monArray addObject:myObject];
    }


     


    Dans mon panier que j'appelle CheckoutCartTableViewController, j'affiche les données contenues dans mon tableau monArray.


     


    Ainsi quand on clique sur un bouton Ajouter au Panier, cela ajoute l'article au tableau monArray, et j'affiche ce tableau dans mon panier.


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