communiquer les données entre deux classes
Genose
Membre
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
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
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Reste à savoir si tu as bien utiliser les bonnes méthodes !
Peux tu nous donner les classes de tes objets ?
.
voila !!
D'autre part, pourquoi donner 16384 en paramètre, alors que ta méthode GetInfoDevice ne prend pas de paramètre d'entrée ?  :-\
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).
.
j'avais pas fait gaffe mais j'ai trop enlever de code, c'etait bien un CString qui est retourner.
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.
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 ?
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...
.
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:
envoie le message à la classe.
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:
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:
- enfin quelle drole d'idée de choisir SetInfoBoxValue comme nom d'instance ??? ça ressemble plutot à un nom d'action ça non ?
bon, je vais vous donner ce que j'ai ecrit depuisle debut, tel quel !
voici le source :
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
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.
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"
[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.
.
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]
Je suis tombé sur ça pour les non-anglophobes parmi vous:
http://www.cocoadev.com/index.pl?HowToTransmitDataBetweenClasses