Accès a un objet depuis une autre Classe

ApheloManisApheloManis Membre
janvier 2015 modifié dans API AppKit #1

Salut

Je me pose la question suivent. Comment accéder à  un objet crée par une autre classe?

Je m'explique. J'ai la Classe A, B, C avec chacune ses propres méthodes.


La Classe A crée un objet B1 qui est une instance de la classe B



classB *B1 = [[classB alloc] init];

Maintenant ce que je veux, c'est accéder au contenue de cet objet depuis la classe C. Pour exécuter une méthodes, en utilisent les données de l'objet B1 crée par la classe A.


Réponses

  • T'as plusieurs solutions.


     


    1- tu passes l'objet en param, ex :



    classB *B1 = [[classB alloc] initWithClassA:A1 andClassC:C1];

    2- t'utilise un singleton pour stocker la classe


     


    3- dans l'objet B tu rajoutes une property classA et donc tu fais ensuite :



    classB *B1 = [[classB alloc] init];
    B1.classA = A1;
  • Bon je bloque, je bloque , je bloque!


     


    Pour résumer, j'ai deux classes MousePosition et CoorditateProssesing. Je ne parviens pas en envoyer les données de MousePosition dans CoorditateProssesing pour les utilisés dans cette dernière.


  • Montre nous ton code pour qu'on comprenne ce que tu essayes de faire exactement.


  • ApheloManisApheloManis Membre
    février 2015 modifié #5

    Ici c'est la seul méthode de la classe MousePosition



    - (void)mouseDown:(NSEvent *)theEvent{
    NSPoint actuallyLocation = [theEvent locationInWindow];
    NSPoint convertedPoint = [self convertPoint:actuallyLocation fromView:nil];
    processing = [[CoordinateProcessing alloc] init];
    [processing setCoordinat:convertedPoint];
    NSLog(@x : %f, convertedPoint.x);
    }

    Dans CoordinateProcessing.h j'ai



    @interface CoordinateProcessing : NSObject{
    NSPoint fixedCoordinated;
    NSPoint actuallyPosition;

    BOOL coordinatedFixed;

    CGFloat distanceFromOrigine;
    }

    - (void)setCoordinat:(NSPoint)value;

    - (void)prosessingStep;

    // Calcule de la diagonale
    - (void)setDistanceFromOrigine;

    et mon CoordinateProcessing.m



    @implementation CoordinateProcessing

    - (void)setCoordinat:(NSPoint)value{
    actuallyPosition = value;
    NSLog(@x:: %f, actuallyPosition.x);
    [self prosessingStep];
    }


    - (void)prosessingStep{
    if (coordinatedFixed == NO) {
    fixedCoordinated = actuallyPosition;
    }
    else
    [self setDistanceFromOrigine];
    }

    - (void)setDistanceFromOrigine;{
    distanceFromOrigine = sqrt(powf(fixedCoordinated.x - actuallyPosition.x, 2) + powf(fixedCoordinated.y - actuallyPosition.y, 2));
    NSLog(@La distance est : %f, distanceFromOrigine);
    }

    @end

    Le problème c'est que MousePosition me crée toujours un nouvel objet CoordinateProcessing. Du coup je ne comprends vraiment pas comment faire


  • samirsamir Membre
    février 2015 modifié #6


    Le problème c'est que MousePosition me crée toujours un nouvel objet CoordinateProcessing. Du coup je ne comprends vraiment pas comment faire




     


    C'est toi qui crée un nouvel objet à  chaque fois avec la ligne : 



    processing = [[CoordinateProcessing alloc] init];

    Si tu ne veux pas crée à  chaque fois un nouvel objet, ben ne le crée pas :). Tu peux agir sur l'objet directement :



    - (void)mouseDown:(NSEvent *)theEvent{
        NSPoint actuallyLocation = [theEvent locationInWindow];
        NSPoint convertedPoint = [self convertPoint:actuallyLocation fromView:nil];
    if(self.processing == nil){
    self.processing = [[CoordinateProcessing alloc] init];
    }    
    [self.processing setCoordinat:convertedPoint];
     NSLog(@x : %f, convertedPoint.x);
    }

  • ApheloManisApheloManis Membre
    février 2015 modifié #7

    Merci merci merci :)


     


    Je suis content, car j'ai trouvé d'autres erreurs du coup :)


  • Je tourne encore en rond ! Je ne parviens pas à  ajouter des infos dans l'objet CoordinateProssesing créé par MousePossition depuis la classe AppDelegate.


  • Salut,


     


    ça dépend comment tu as déclaré ton objet "CoordinateProssesing" et ou tu l'as déclaré. Montre plus de code en rapport avec ton objet "CoordinateProssesing" 


  • Là  il commence à  devenir long le code. Du coup j'ai mis le projet sur GitHub. La déclaration de l'objet CoordinateProssesing je l'ai fait comme tu me l'as proposé


  • Puisque tu l'as déclaré dans "MousePosition" donc il faut d'abord avoir une référence vers cette dernière puis accéder à  ton objet.


     


    Rajoute ça dans ton AppDelegate :



    @property (nonatomic, weak) IBOUtlet MousePosition *mousePosition;

    Ensuite tu relie ton outlet dans ton xib


     


    Maintenant tu peux accéder à  ton objet "CoordinateProssesing" via mousePosition que tu as déclarée dans l'AppDelegate.


     


    PS :  Ce n'est pas la meilleur solution que je t'ai donnée, tu peux améliorer ton code :


     


    Utilisation des property au lieux des iVar


    Une seule responsabilité par classe,


     


    Mais bon essaie de résoudre ton problème e mousePosition d'abord :).


     


    Révise un peu aussi les notions des classes, objet,...


     


    https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/OOP_ObjC/OOP_ObjC.pdf

  • Merci encore. C'est ma première app en dehors des sentiers battus des livres :). Du coup j'ai un peu de mal à  lier toutes les infos reçu.


     


    Là  je fais une première version comme je peux, pour comprendre la relation entre les objets et le fonctionnement de la programmation orienté objet. Puis en deuxième partie. Je compte faire plusieurs classes, utiliser les property et réduire le code. Ce n'est pas évident tout ça au début :)


  • ApheloManisApheloManis Membre
    février 2015 modifié #13

    Il se trouve que peux importe l'emplacement dans AppDelegate de 



    @property (nonatomic, weak) IBOUtlet MousePosition *mousePosition;

    j'ai un warning rouge ! J'importe bien MousePosition 


  • Joanna CarterJoanna Carter Membre, Modérateur
    Pourquoi mettre les IBOutlets dans l'AppDelegate ? Ils sont plutôt pour connecter aux contrôleurs.
  • AliGatorAliGator Membre, Modérateur
    J'ai l'impression qu'il y a beaucoup de concepts tant sur la POO et son application en ObjC que sur l'utilisation d'Outlets et le fonctionnement d'InterfaceBuilder qui sont à  réviser.


    Je t'invite à  réaliser quelques tutos ou visionner les cours de Stanford (gratuit sur iTunesU) et pour mieux comprendre tous ces mécanismes, tu y verras plus clair après.
  • CéroceCéroce Membre, Modérateur
    février 2015 modifié #16


    Pourquoi mettre les IBOutlets dans l'AppDelegate ? Ils sont plutôt pour connecter aux contrôleurs.




     


    Parce que sur Mac, l'App Delegate est souvent instancié dans MainMenu.xib, alors c'est un objet facilement accessible. Quand on veut bricoler rapidement, ça a du sens.


    (Même si c'est une mauvaise idée sur le long terme).


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