Plus ou moins?

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)
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)
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[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.
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).
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
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.
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.
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
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
soit en plus clair