IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

communiquer entre les viewController


Sujet :

Objective-C

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut communiquer entre les viewController
    Bonjour

    dans mon application j'ai:
    2-ViewControllers avec 2 nib.

    le premier viewController affiche dans un tableView le résultat d'un feedxml (produits, prix) et onClick sur un bouton_filtre j'affiche une view qui donne la main pour entrer la marge de prix (prix min et prix max) pour qu'après on filtre les résultats de la première view

    maintenant onclick sur le bouton appliquer_filtre je doit revenir sur la première view et recharger le tableview selon ce filtre

    je fais l'appel du filtre comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    [self.navigationController presentModalViewController:fltr animater:Yes]
    le bouton appliquer_filtre qui va revenir à la première view contient le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    filtrePrixMin=@"10";
    //ici je dois mettre à jour la valeur prixMin du premier viewController et recharger ses données
    [super dismissModalViewControllerAnimated:Yes]
    Merci d'avance pour votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Plusieurs solutions :

    I. Par design OO :
    a. sous-classer le ou les ViewController pour lui/leur ajouter un IBOutlet que vous reliez sur l'autre
    ou
    b. créer une classe ViewController commune et sous-classer 2 fois pour chaque ViewController concerné, la communication pouvant se faire par des méthodes de l'ancêtre mais implémentées différemment par les 2 classes filles

    II. avoir un Object commun et connu des 2 ViewController pour communiquer à travers lui (un bon candidat est le delegate, mais pas la seule possibilité)

    III. passer par le NotificationCenter et dispatcher une notification : le controller "réception" devant avoir été ajouté aux "clients" de cette notification via "addObserver"

    (… et il y en a certainement d'autres.)

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    est ce que cela doit faire l'affaire: lien
    je ne l'ai pas encore testé, j'aimerai avoir votre avis avant:
    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    est ce que cela doit faire l'affaire: lien
    je ne l'ai pas encore testé, j'aimerai avoir votre avis avant:
    Merci
    ce lien vous illustre le I et le II du post précédent : soit des sous-classes, soit passer par le delegate.

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    J'ai pas trop compris comment utiliser les 2 méthodes dans mon cas
    voici un peu près mon MainWindow
    TabBar
    ->...
    ->...
    ->...
    ->NavigationBar
    --->UIViewcontrollerA contenant un tableView(Affichant des données) et un bouton filtre


    le Code du bonton filtre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [self.navigationController presentModalViewController:fltr animater:Yes]
    au clic sur le bouton filtre: je cherche un UIViewControllerFiltre

    lorsque j'applique le filtre je dois reloader les données du UIViewcontrollerA

    Si vous pouvez m'indiquer la procédure je serai très reconnaissant.

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    je suis entrain d'implémenter la solution de délégation:

    j'ai 2 viewcontrollers:
    -le parentViewController "ShowController" contient un tableView et button filtre
    -le childViewController "Filtre" doit:
    • envoyer des paramètres audu filtre au controller parent
    • et reafficher le parent en rechargeant son tableView

    maintenant j'essaie de créer un protocol dans le Filtre.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    @protocol myDelegate
     -(void)clickedButton:(subviewcontroller *)subController;
    @end
    et ajouter dans @ interface Filtre cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    le id<myDelegate> delegate;
    et je reçoit une erreur car si je met le protocole en haut il ne reconnais pas la le viewController filtre alors qu'en bas l'interface Filtre ne reconnais pas le:id<myDelegate> delegate;

    Je suis vraiment confus

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 934
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 934
    Points : 4 347
    Points
    4 347
    Par défaut
    la syntaxe Objective-C pour briser les références circulaires entre @class ou @protocol est simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @class Class_Defined_Somewhere_Later ;
    @protocol Protocol_Defined_Somewhere_Later ;

  8. #8
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    ça ne marche pas

    J'ai créé une nouvelle refRec.h
    dans la quelle j'ai défini le protocol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @protocol myDelegate
     -(void)clickedButton:(subviewcontroller *)subController;
    @end
    et dans le viewController Filtre.h je l'importe mais le filtre ne reconnais pas cette ligne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    id<myDelegate> delegate;
    est ce que vous n'avez pas un tutoriel ou un exemple qui illustre la délégation?

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    J'ai essayé de séparer le problème en créant un petit projet pour tester la délégation. Voici mon projet:
    http://rapidshare.com/files/42724333...Delegation.zip

    je ne sais pas si j'ai oublié quelque chose

  10. #10
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    je galère toujours sans résultat

    je vais montrer mon code je ne sais pas si j'ai oublié quelque chose.
    J'ai 2 viewcontroller

    le parent: testDelegationViewController
    le fils: modal

    le testDelegationViewController.h contient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #import <UIKit/UIKit.h>
    #import "modal.h";
     
    @interface testDelegationViewController : UIViewController<myDelegate> {   
        IBOutlet UIButton *btnParent ;
        IBOutlet UILabel *lblParent ;
    }
     
    @property (nonatomic, retain) IBOutlet UIButton *btnParent;
    @property (nonatomic, retain) IBOutlet UILabel *lblParent;
    -(IBAction) parentButtonclicked;
     
    @end
    le testDelegationViewController.m contient:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #import "testDelegationViewController.h"
    #import "modal.h";
     
    @implementation testDelegationViewController
     
    @synthesize btnParent;
    @synthesize lblParent;
     
    -(IBAction) parentButtonclicked
    {
     
    	self.lblParent.text=@"changed by btnParent";
    	modal *m = [[modal alloc] initWithNibName:@"modal" bundle:nil];
    	[self presentModalViewController:m animated:YES];	
     
    }
     
    - (void)modalButtonlicked:(NSString *)subcontroller
    {
     
    	NSLog(@"modal Button clicked");// >>>>>>>>>>j'arrive pas ˆ entrer ici<<<<<<<<<<<<<<<<<
    	//NSString *myData = [subcontroller getData];
    	//[self dimissModalViewControllerAnimated:YES];
     
    }
     
     
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
     
    - (void)viewDidUnload {
    }
     
     
    - (void)dealloc {
        [super dealloc];
    }
     
    @end
    le modal.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #import <UIKit/UIKit.h>
     
     
    //@protocol myDelegate;
    @protocol myDelegate
    -(void)modalButtonlicked:(NSString *)subController;
    //-(void)clickedButton:(modal *)subController;
    @end
     
     
    @interface modal : UIViewController {
     
        IBOutlet UIButton *btnmodal ;
        id<myDelegate> delegate;
        NSString *data;
     
    }
     
     
     
    @property (nonatomic, retain) IBOutlet UIButton *btnmodal;
    @property (nonatomic, assign) id<myDelegate> delegate;   
     
    -(IBAction) returnParent;
    -(NSString *)getData;
     
     
     
    @end
    le modal.m :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    #import "modal.h"
     
     
    @implementation modal
     
    @synthesize btnmodal;
    @synthesize delegate;
     
     
    -(IBAction) returnParent
    {
        NSLog(@"child button clicked");
        [delegate modalButtonlicked:@"change parent label from modal"];
        //[delegate modalButtonlicked:self];//je vais utiliser a par la suite pour mettre le dismiss dans le parent
     
        [super dismissModalViewControllerAnimated:YES];
     
    }
     
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    - (void)viewDidUnload {
        [super viewDidUnload];
    }
    - (void)dealloc {
        [super dealloc];
    }
    @end
    le boutton de chaque viewcontroller est connecté avec InterfaceBuilder


    je compte toujours sur votre aide svp

  11. #11
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    j'ai oublié la ligne suivante dans le parentViewConteroller
    maintenant ça marche

    il faut mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Childcontroller *CC=[[Childcontroller  alloc] initWithNibName:@"nibFile" bundle:nil];
    CC.delegate=self;
    [self presentModalViewController:CC animated:YES];
    Merci JeitEmgie d'avoir essayer de m'aider

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 67
    Dernier message: 16/12/2007, 14h41
  2. Réponses: 1
    Dernier message: 15/05/2007, 12h35
  3. [c#] communiquer entre les instances d'une appli
    Par damned3 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 10/10/2006, 11h32
  4. Benchmark entre les langages
    Par El blérot dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 27/12/2002, 02h22
  5. Réponses: 3
    Dernier message: 07/05/2002, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo