communiquer les données entre deux classes

GenoseGenose Membre
15:53 modifié dans API AppKit #1
salut,


je cherche comment véhiculer les données entre deux classes comme cela :


[SetInfoBoxValue setStringValue: [NSString stringWithCString:[RefreshDevice GetInfoDevice:16384]]];


mais bon ce n'est pas tre concluant.

quelqu'un saurait il m'aider !!

merci

Réponses

  • BruBru Membre
    15:53 modifié #2
    Cela a l'air correct...

    Reste à  savoir si tu as bien utiliser les bonnes méthodes !
    Peux tu nous donner les classes de tes objets ?

    .
  • GenoseGenose Membre
    octobre 2004 modifié #3
    @interface InfoDevices : NSObject<br />{<br />    IBOutlet id setBtnValue;<br />    IBOutlet id SetInfoBoxValue;<br />    IBOutlet id SetInfoList;<br />}<br />- (IBAction)GetDeviceInfoValue:(id)sender;<br />-(void)awakeFromNib;<br /><br />@end<br />
    


    <br />@interface RefreshDevice : NSObject<br />{<br />  <br />    id deviceSelected;<br />    const char* PText;<br /><br />   <br />    NSArray  *devices ;<br />    NSMutableArray  *devices_prmList ;<br /> <br />}<br />- (IBAction)DeviceInfo:(id)sender;<br />- (id)GetInfoDevice;<br /><br />-(void)awakeFromNib;<br />@end
    



    <br />@implementation RefreshDevice<br /><br />- (IBAction)DeviceInfo:(id)sender<br />{<br /><br /><br />}<br /><br />- (id)GetInfoDevice<br />{<br /><br />return @&quot;--------&quot;;<br /><br />}<br /><br />@end <br />
    


    voila !!
  • Eddy58Eddy58 Membre
    15:53 modifié #4
    As-tu importé ton interfaçage RefreshDevice dans InfoDevices ?
    D'autre part, pourquoi donner 16384 en paramètre, alors que ta méthode GetInfoDevice ne prend pas de paramètre d'entrée ?   :-\
  • BruBru Membre
    15:53 modifié #5
    Plus grave...

    GetInfoDevice renvoie un id (dans ton cas, c'est une NSString), or tu l'utilises comme paramètre pour stringWithCString:. Cette dernière méthode attend comme paramètre un pointeur sur une chaine C, et non un pointeur d'objet cocoa...

    Ca c'est plantage garanti !

    essaie plutôt ça :
    [tt]
    SetInfoBoxValue setStringValue:[RefreshDevice GetInfoDevice]];
    [/tt]

    (j'ai supprimé le paramètre 16384, comme l'a judicieusement fait remarquer Eddy).

    .
  • GenoseGenose Membre
    15:53 modifié #6
    dans 1099071621:

    Plus grave...

    GetInfoDevice renvoie un id (dans ton cas, c'est une NSString), or tu l'utilises comme paramètre pour stringWithCString:. Cette dernière méthode attend comme paramètre un pointeur sur une chaine C, et non un pointeur d'objet cocoa...

    Ca c'est plantage garanti !


    j'avais pas fait gaffe mais j'ai trop enlever de code, c'etait bien un CString qui est retourner.


    dans 1099071621:

    essaie plutôt ça :
    [tt]
    SetInfoBoxValue setStringValue:[RefreshDevice GetInfoDevice]];
    [/tt]




    j'ai essayer, ca a bien appeler ce que je chercher a obtenir , mais ca ne marchais entierement (pas de return) pas jusqu'a ce que je mette

    +(id)GetInfoDevice:(int)ref;

    et la tout a fonctionner a merveille, car il chercher un +[RefreshDevice GetInfoDevice], alors qu'elle n'exisais meme pas, d'ou un arret du program.


    sinon merci c'est trop cool car now tout est operationnel j'ai aussi pu voir que j'avais fait des erreur de prog inside de la methode qui faisait planter l'implemnetation complete de +(id)GetInfoDevice:(int)ref

    j'aurais bien appris grace a vous , merci a tous et a tanto.
  • GenoseGenose Membre
    15:53 modifié #7
    salut, heu je me suis emporté car l'appel est correct mais la finalité est incomplete en realité.

    ca fait deux jour que je tente de trouver une facon pour transmettre ma varible d'instance de ma class. en relisant la doc j'ai vu que les variable ne sont pas accessible depuis les methode de class et impossible de trouver un equivalent du c++, j'ai du mal a integrer ce concept coté cocoa;


    une idées ?
  • BruBru Membre
    15:53 modifié #8
    Tu mélanges notion de classe et notion d'objet...

    Ne sachant pas au juste ce que tu veux faire (qu'est ce que RefreshDevice ?), il est difficile de t'aider...

    Si tu veux utiliser des "variables" dans les méthodes de classe, alors essaie de créer des variables de classe. Mais ce n'est pas la meilleure solution je pense...

    .
  • ClicCoolClicCool Membre
    15:53 modifié #9
    Bonjour Genose :)

    Comme tu l'as dit, +(id)GetInfoDevice:(int)ref est une méthode de classe qui ne peut te donner accès qu'à  des variables de classe ;)

    Pour accéder à  des variable d'instance il te faut une méthode d'instance: -(id)GetInfoDevice:(int)ref
    Il te faut alors bien sur un pointeur sur une instance à  laquelle tu envoies le message GetInfoDevice.

    si RefreshDevice est ta classe:
    [RefreshDevice GetInfoDevice:ref]
    
    envoie le message à  la classe.
    [refreshDeviceInstance GetInfoDevice:ref]
    
    envoie le message à  l'instance pointée par refreshDeviceInstance.

    pour accéder aux instances tout dépend de leur mode de création.
    Quand c'est par le code genre alloc init, tu dois garder un pointeur sur l'instance dès sa création:
    RefreshDevice* refreshDeviceInstance = [[RefreshDevice aloc] init];
    


    Mais d'après tes bouts de code, ta classe est instanciée par le nib, il te faut alors utiliser un outlet connecté avec l'instance dans I.B.



    Et, si je peux me permettre, j'avoue que je me perds un peu dans ton code:

    - D'une façon générale essaies de commencer les noms des instances par une minuscule et les noms de classe par une Majuscule. Comme ça d'un coup d'oeil tu vois avec qui tu cause.

    - Par ailleurs, chaque fois que c'est possible, il est utile de typer plus précisemment tes outlets. Ce sera plus clair à  la lecture pour toi et permettra à  la compilation une vérification plus pertinente des méthodes acceptées par ton outlet
    Par ex:
    IBOutlet RefreshDevice* SetInfoBoxValue;
    


    - enfin quelle drole d'idée de choisir SetInfoBoxValue comme nom d'instance ??? ça ressemble plutot à  un nom d'action ça non ?
  • GenoseGenose Membre
    15:53 modifié #10
    oui c'est vrai que c'est tres confu, j'ai remanier ca

    bon, je vais vous donner ce que j'ai ecrit depuisle debut, tel quel !

    voici le source :
    <br /><br />/* RefreshDevice */<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface DeviceLister : NSObject<br />{<br />&nbsp; &nbsp; @public<br /><br />&nbsp; &nbsp; NSMutableArray&nbsp; *devices,*devices_A ;<br />&nbsp;  <br />&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; @private<br /><br />&nbsp; &nbsp; NSMutableArray&nbsp; *devices_VPID ;<br />&nbsp; &nbsp; id deviceSelected;<br />&nbsp; &nbsp; const char* PText;<br />&nbsp; &nbsp; long PID, VID ;<br />&nbsp; &nbsp; short alert;<br /><br />&nbsp;  <br />&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet id&nbsp; DeviceUseList;<br />&nbsp; &nbsp; IBOutlet id&nbsp; DeviceInfoList;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet id DeviceFoundList;//menu of found device <br />&nbsp; &nbsp; IBOutlet id LogsDeviceFound;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet id PIDValue;<br />&nbsp; &nbsp; IBOutlet id VIDValue;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet id ProgressBarStatus;<br />&nbsp; &nbsp; IBOutlet id TextSetting;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; IBOutlet id WhatFactorySeries;//NSView<br />&nbsp; &nbsp; IBOutlet id WhatPID_VIDButton;<br />&nbsp; &nbsp; IBOutlet id RefreshButton;<br />&nbsp; &nbsp; <br />}<br /><br />+ (id)GetInfoDevice;<br />- (IBAction)logrefresh:(id)sender;<br /><br />- (id)DeviceInfo:(id)sender;<br />/* ... */<br />-(id)ListValidDevice:(long)This_vid :(long)This_pid;<br />-(id)awakeFromNib;<br /><br />@end<br /><br /><br />
    


    <br />#import &quot;DeviceLister.h&quot;<br /><br />#include &quot;usb_cocoa.h&quot;<br /><br /><br /><br />@implementation DeviceLister<br /><br />- (id)DeviceInfo:(id)sender<br />{<br /><br />return [[devices objectAtIndex:0&nbsp; ]objectAtIndex:0];<br />}<br /><br />+ (id)GetInfoDevice<br />{<br /><br /><br /><br /><br /><br /><br />return [self DeviceInfo];<br /><br />}<br /><br />- (IBAction)logrefresh:(id)sender<br />{<br /><br /><br />}<br /><br /><br /><br /><br />-(id)awakeFromNib<br />{<br /><br />[TextSetting setStringValue:@&quot;Actual setting:&#092;n&#092;nnone&quot;];<br /><br />[LogsDeviceFound setStringValue:@&quot;Device log:&#092;n&#092;nnone&quot;];<br /><br /><br /><br /><br />[PIDSetting setIntValue:0];<br />[VIDSetting setIntValue:0];<br /><br /><br /><br /><br /> devices_VPID = <br />[[NSMutableArray alloc ]&nbsp; initWithObjects:<br />&nbsp; &nbsp; [NSMutableArray&nbsp;  arrayWithObjects: @&quot; 232 serie &quot;,[NSString stringWithFormat:@&quot;%d&quot;,0x6001],[NSString stringWithFormat:@&quot;%d&quot;,0x403],nil],//0<br />&nbsp; &nbsp; [NSMutableArray&nbsp;  arrayWithObjects: @&quot; 245 serie &quot;,[NSString stringWithFormat:@&quot;%d&quot;,255],[NSString stringWithFormat:@&quot;%d&quot;,0x403],nil],//1<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; [NSMutableArray&nbsp;  arrayWithObjects:@&quot; Factory all&quot;,//2<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [NSMutableArray&nbsp;  arrayWithObjects: @&quot; 232 serie &quot;,[NSString stringWithFormat:@&quot;%d&quot;,0x6001],[NSString stringWithFormat:@&quot;%d&quot;,0x403],nil],<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; [NSMutableArray&nbsp; arrayWithObjects: @&quot; 245 serie &quot;,[NSString stringWithFormat:@&quot;%d&quot;,255],[NSString stringWithFormat:@&quot;%d&quot;,0x403],nil] <br />&nbsp; &nbsp; &nbsp; &nbsp; ,nil],&nbsp; nil ];<br /><br /> alert=0;<br />&nbsp; &nbsp; devices = [[NSMutableArray alloc]init];<br />&nbsp; &nbsp;  devices_A = [[NSMutableArray alloc]init];<br />&nbsp; &nbsp;  <br />&nbsp; &nbsp; devices = [self ListValidDevice:[[[devices_VPID objectAtIndex:0&nbsp; ]objectAtIndex:2] intValue ] :[[[devices_VPID objectAtIndex:0&nbsp; ]objectAtIndex:1 ] intValue]];<br /><br />&nbsp; &nbsp;  <br />&nbsp; &nbsp;  <br />return self;<br /><br />}<br />@end<br /><br />
    



    <br /><br />/* InfoDevices */<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface InfoDevices : NSObject<br />{<br />&nbsp; &nbsp; IBOutlet id infoBtn;<br />&nbsp; &nbsp; IBOutlet id infoBox;<br />&nbsp; &nbsp; IBOutlet id infoList;<br />}<br />- (IBAction)GetDeviceInfoValue:(id)sender;<br />-(void)awakeFromNib;<br /><br />@end<br /><br /><br /><br />
    



    <br /><br />#import &quot;DeviceLister.h&quot;<br />#import &quot;RefreshDevice.h&quot;<br />#include &quot;usb_cocoa.h&quot;<br /><br /><br /><br /><br /><br /><br />@implementation InfoDevices<br /><br />- (IBAction)GetDeviceInfoValue:(id)sender<br />{<br /><br />int ret = 0;<br /><br /><br /><br /><br />ret = [[DeviceLister GetInfoDevice]count];<br /><br />[infoBox setStringValue:@&quot;-------&quot;];<br /><br /><br />//[infoBox setStringValue: [ [ [DeviceLister GetInfoDevice] objectAtIndex:0&nbsp; ] objectAtIndex:0]&nbsp; ]; //return un NSString<br /><br />}<br />-(void)awakeFromNib<br />{<br />[infoBox setStringValue:@&quot;--&quot;];<br /><br /><br />}<br /><br />@end<br /><br /><br />
    




    et donc voila ce qui m'arrive, quand je click sur le button infoBTN,

    * InfoDevices :: GetDeviceInfoValue() est appeler
    * DeviceLister :: GetInfoDevice est appeler en tant que +[DeviceLister GetInfoDevice]

    ne pouvant acceder a ma liste (NSMutableArray *Devices ), j'encapsule l'appel avec

    <br /><br /> [self DeviceInfo]; // - [DeviceLister DeviceInfo]<br /><br />/* puis&nbsp; DeviceLister::GetInfoDevice donne*/<br /><br />return Devices;<br /><br />
    


    pour qu'il me donne acces au données, comme cela aurais etait possible avec public et friend en c++, mais je me rend compte que c'est un drole de machin auquel que je comprend pas bien le sens de la chose, cocoa me laisse avec beaucoup de questions sur ce principe la.


    <br /><br />return [self DeviceInfo];<br /><br />
    


    me retourne(rai) une copy de Devices vers la classe InfoDevice est ainsi je pourrais continuer tranquillement a parcourir mon NSMutableArray dans la class InfoDevice et remplir le champ text infoBox

    voila ce que je tente d'acomplir.

    :trinque:



    #warning "ps: l'appli est visible chez sf.net"
  • BruBru Membre
    novembre 2004 modifié #11
    Bon, j'ai regardé un peu tout ça, et je te propose une correction :
    [tt]
    /* RefreshDevice */

    #import <Cocoa/Cocoa.h>

    @interface DeviceLister : NSObject
    {
        @public

        NSMutableArray  *devices,*devices_A ;

        @private

        NSMutableArray  *devices_VPID ;
        id deviceSelected;
        const char* PText;
        long PID, VID ;
        short alert;

        IBOutlet id  DeviceUseList;
        IBOutlet id  DeviceInfoList;
        IBOutlet id DeviceFoundList;//menu of found device
        IBOutlet id LogsDeviceFound;
        IBOutlet id PIDValue;
        IBOutlet id VIDValue;
        IBOutlet id ProgressBarStatus;
        IBOutlet id TextSetting;
        IBOutlet id WhatFactorySeries;//NSView
        IBOutlet id WhatPID_VIDButton;
        IBOutlet id RefreshButton;
    }

    - (id)GetInfoDevice;
    + (id)sharedInstance;

    - (IBAction)logrefresh:(id)sender;
    - (id)DeviceInfo:(id)sender;
    - (id)ListValidDevice:(long)This_vid :(long)This_pid;
    - (void)awakeFromNib;

    @end
    [/tt]


    [tt]
    #import "DeviceLister.h"
    #include "usb_cocoa.h"

    static id __sharedInstance;

    @implementation DeviceLister

    + (void)initialize
    {
        __sharedInstance=nil;
    }

    + (id)sharedInstance
    {
        return __sharedInstance;
    }

    + (id)alloc
    {
        id obj;
        if (obj=[super alloc]) if (!__sharedInstance) __sharedInstance=self;
        return obj;
    }


    - (id)DeviceInfo:(id)sender
    {
        return [[devices objectAtIndex:0] objectAtIndex:0];
    }

    - (id)GetInfoDevice
    {
        return [self DeviceInfo:nil];
    }


    - (IBAction)logrefresh:(id)sender
    {
        ;
    }

    -(void)awakeFromNib
    {
        [TextSetting setStringValue:@Actual setting:\n\nnone];
        [LogsDeviceFound setStringValue:@Device log:\n\nnone];
        [PIDSetting setIntValue:0];
        [VIDSetting setIntValue:0];

        // j'ai refait des indentations "propres" car ça faisait un peu fouillis...
        devices_VPID=[[NSMutableArray alloc ]
                 initWithObjects:
                     [NSMutableArray arrayWithObjects:
                         @ 232 serie ,
                         [NSString stringWithFormat:@%d,0x6001],
                         [NSString stringWithFormat:@%d,0x403],
                         nil],
                     [NSMutableArray arrayWithObjects:
                         @ 245 serie ,
                         [NSString stringWithFormat:@%d,255],
                         [NSString stringWithFormat:@%d,0x403],
                         nil],
                     [NSMutableArray arrayWithObjects:@ Factory all,
                         [NSMutableArray arrayWithObjects:@ 232 serie ,
                         [NSString stringWithFormat:@%d,0x6001],
                         [NSString stringWithFormat:@%d,0x403],
                         nil],
                     [NSMutableArray arrayWithObjects:@ 245 serie ,
                         [NSString stringWithFormat:@%d,255],
                         [NSString stringWithFormat:@%d,0x403],
                         nil],
                     nil],
                 nil];

        alert=0;
        devices=[[NSMutableArray alloc] init];
        devices_A=[[NSMutableArray alloc] init];

        // je supprime la ligne suivante ligne car ça ne veut rien dire (ListValidDevice non implémenté)
        // et devices déjà  initilisé plus haut par alloc/init...
        devices = [self ListValidDevice:[devices_VPID objectAtIndex:0] objectAtIndex:2] intValue][/s][/color]<br />                                   [color=Red][s]:[[[devices_VPID objectAtIndex:0] objectAtIndex:1] intValue;
        return self;

    }

    @end
    [/tt]


    [tt]
    /* InfoDevices */

    #import <Cocoa/Cocoa.h>

    @interface InfoDevices : NSObject
    {
        IBOutlet id infoBtn;
        IBOutlet id infoBox;
        IBOutlet id infoList;
    }
    -(IBAction)GetDeviceInfoValue:(id)sender;
    -(void)awakeFromNib;

    @end
    [/tt]


    [tt]
    #import "DeviceLister.h"
    #import "RefreshDevice.h"
    #include "usb_cocoa.h"

    @implementation InfoDevices

    - (IBAction)GetDeviceInfoValue:(id)sender
    {
        int ret = 0;
        ret=[[[DeviceLister sharedInstance] GetInfoDevice] count];
        [infoBox setStringValue:@-------];
        //[infoBox setStringValue: [ [ [DeviceLister GetInfoDevice] objectAtIndex:0  ] objectAtIndex:0]  ]; //return un NSString
    }

    -(void)awakeFromNib
    {
        [infoBox setStringValue:@--];
    }

    @end
    [/tt]


    En rouge, c'est ce que j'ai rajouté, en barré, c'est ce que j'ai retiré...
    Inspire en toi.

    .
  • muqaddarmuqaddar Administrateur
    15:53 modifié #12
    Un vrai prof ce Bru ! ;)
  • GenoseGenose Membre
    15:53 modifié #13
    je vais y regarder , merci
  • GenoseGenose Membre
    novembre 2004 modifié #14


    les mots me manque :crackboom:-

    bru

    :trinque:



    correction sinon dans le cas ou ca ne s'initialise pas (ce qui est mon cas )

    -(void)awakeFromNib
    {
    __sharedInstance=self;

    }


    ci-joint copie d'ecran




    [Fichier joint supprimé par l'administrateur]
  • 15:53 modifié #15
    1.... 2.... 3.... UP.

    Je suis tombé sur ça pour les non-anglophobes parmi vous:
    http://www.cocoadev.com/index.pl?HowToTransmitDataBetweenClasses
Connectez-vous ou Inscrivez-vous pour répondre.