Plus ou moins?

tabliertablier Membre
17:00 modifié dans Vos applications #1
Dans une fenêtre, j'ai un bouton qui demande une action à  un controleur. Cette action sera executée par l'objet Convert qui est relié au controleur par un outlet.

Le .h de la classe de l'objet qui est impoté dans le controleur:

#import <Cocoa/Cocoa.h>
@interface Convert : NSObject {}
- (float)convertAmount:(float)Somme atRate:(float)auTaux zero:(BOOL)ZZero Coef:(int)fois ;
@end

L'appel dans le controleur:

float  total = [Convert convertAmount:float1 atRate:float2 zero:YES Coef:1] ; (**)

A la compilation j'obtiens:

...warning: 'Convert' may not respond to '+convertAmount:atRate:zero:Coef:'
...warning: (Messages without a matching method signature will be assumed to return id.....
..........
.......error: incompatible types in assignment
Build failed (1 error, 1 warning)

L'erreur est provoquée par la même ligne que le warning (**).
Il semble que la méthode  - (float)convertAmount:.... ne soit pas vu par le compilateur!  j'ai vérifié la signature de la méthode: -convertAmount:atRate:zero:Coef:,  puis  j'ai changé le - en +.  Warning et erreur disparaissent et tout marche au poil!  Je n'y comprend rien!!
Je prend toutes les suggestions, merci d'avance.
(OSX 10.4.3, Xcode 2.2, GCC 4.01)

Réponses

  • Eddy58Eddy58 Membre
    novembre 2005 modifié #2
    Est-ce que dans l'interfaçage de ton controleur tu as bien fait l'import ? ???
    [tt]
    #import "Convert.h"
    [/tt]

    Et est-ce que tes classes Convert et Controleur utilisent chacune des méthodes l'une de l'autre ? Si oui il faut utiliser la directive @class dans tes deux classes.
  • MalaMala Membre, Modérateur
    17:00 modifié #3
    [Convert convertAmount:float1 atRate:float2 zero:YES Coef:1] ;

    C'est un appel à  une méthode de classe et non d'instance que tu as fait. Donc c'est normal.

    Si tu mets un - devant la déclaration d'une méthode, tu demandes au compilateur de considérer que c'est une méthode d'instance (qui nécessite donc une instanciation de la classe).

    puis  j'ai changé le - en +.  Warning et erreur disparaissent et tout marche au poil!  Je n'y comprend rien!!

    Tout à  fait normal. Pour mieux en comprendre le fonctionnement regardes le topic de zenx qui posait justement la question sur la différence entre methode de classe et d'instance...
    http://www.objective-cocoa.org/forum/index.php?topic=1404.msg14654;topicseen#msg14654
  • tabliertablier Membre
    17:00 modifié #4
    J'ai lu le topic de Zenc. Je réponds aux questions posées:
    1 Oui j'ai bien importé le "converter.h"
    2 Seul le controleur utilise une méthode de converter. (pas d'utilisation croisée).

    Neanmoins cela ne marche toujours pas! Le problème doit être effectivement entre Classe et instanciation. Peut-etre est-ce mon utilisation de Interface builder qui est mauvaise?

    Après avoir réalisé l'interface graphique, les classes Controleur et converter sont générées comme sous-classes de NSObject dans le volet "Classes" de la fenêtre du nib. Le controleur est alors muni des outlets et de l'action nécessaires, puis les deux classes sont instanciées. Dans le volet instances, j'effectue ensuite les liaisons controleur-ObjetsGraphique-outlets, puis la liason ObjetGraphique-controleur-action. enfin je lie controleur-converter-outlet.
    Il me reste à  générer les fichiers en utilisant "creates files xx" du menu "classes", puis a implémenter le code.
    A noter que j'ai employé là , la méthode développée dans le tutorial "Currency converter".
    Je ne vois pas d'erreur la dedans, mais je me trompe forcément puisque ça ne marche pas.

    D'avance merci pour votre aide.
  • CéroceCéroce Membre, Modérateur
    17:00 modifié #5
    Je crois que Mala t'a déjà  donné la réponse.

    Si la méthode commence par -, c'est une méthode d'instance et tu dois instancier un object "modèle", Convert , dans la méthode -init de ton contrôleur.
    Les objets "Vue" (le bouton) et "Contrôleur" sont eux instanciés à  l'ouverture de l'application, puisqu'ils apparaà®ssent sous forme d'icône dans ton .nib.
  • AntilogAntilog Membre
    17:00 modifié #6
    Dans IB, tu dois avoir instancié le controlleur (Cliques sur Converter, ensuite sélectionne instantiate dans le menu class, si ce n'est pas déjà  fait).
    Ensuite, il faut connecter l'objet converter que tu as créé avec l'Outlet correspondante dans ConverterController.

    Ensuite, l'appel à 
    [tt]float  total = [Convert convertAmount:float1 atRate:float2 zero:YES Coef:1] ;[/tt]
    doit se faire sur l'objet créé, pas la classe, soit
    [tt]float  total = [convert convertAmount:float1 atRate:float2 zero:YES Coef:1] ;[/tt]
    Le problème ici est que l'exemple d'Apple nomme les objets de la même façon que la classe, mis à  part la majuscule!!!

    Il est ainsi très facile de se tromper.
    Ce serait plus clair avec aConvert ou myConvert ou theConvert...

    Bon courage

  • tabliertablier Membre
    17:00 modifié #7
    Bien, je crois que j'ai compris: de même que le controlleur accède aux objets graphiques par les outlets de liaison, il appelle la methode - (float)convertAmount:fl....... de l'objet Convert par l'intermédiaire de l'outlet qui les relie. Dans mon cas le nom est convert. d'ou l'appel qui marche:
    float  total = [convert convertAmount:fl.......    ];

    C'est vrai que beaucoup d'exemples ont des noms très voisins pour: la classe, l'objet, les variables, les accesseurs ....etc  Cela embrouille nettement les choses!!

    Merci pour vos réponses
    A+
  • AntilogAntilog Membre
    17:00 modifié #8
    dans 1133287174:

    Bien, je crois que j'ai compris: de même que le controlleur accède aux objets graphiques par les outlets de liaison, il appelle la methode - (float)convertAmount:fl....... de l'objet Convert par l'intermédiaire de l'outlet qui les relie. Dans mon cas le nom est convert. d'ou l'appel qui marche:
    float  total = [convert convertAmount:fl.......    ];

    C'est vrai que beaucoup d'exemples ont des noms très voisins pour: la classe, l'objet, les variables, les accesseurs ....etc  Cela embrouille nettement les choses!!

    Merci pour vos réponses
    A+


    Exact!
    En fait, l'outlet représente le pointeur vers l'objet concerné, celui que tu aurais si tu avais instantié la classe par le code, par
    Convert * convert = [[Convert alloc] init];
    

    soit en plus clair
    Classe* objet;<br />objet =&nbsp; [[Classe alloc] init];
    
Connectez-vous ou Inscrivez-vous pour répondre.