Aller au contenu

Appeler une méthode dans une classe


zekiller28
 Share

Messages recommandés

Hello !

 

Alors j'ai créé une sous-classe (.h et .m) supplémentaire (NSObject) dans mon projet initial nommée testClasse.h et testClasse .m…

 

Quand je créé une méthode dans mon projet habituel, un

[self maMethode];

suffit à appeler cette dernière

 

 

Par contre si ma méthode se trouve dans un autre fichier .m (testClasse.m dans mon cas), comment je l'appelle dans mon projet m.AppDelegate?

 

J'ai bien importé le fichier .h

#import "testClasse.h"

dans mon .m AppDelegate

Mais je n'arrive pas à appeler ma méthode nommée "envoyerMessageDansConsole" dans le code de mon action de bouton qui lui se trouve dans le .m de AppDelegate

 

J'ai essayé dans le TestClasse.h de mettre un

-(void)envoyerMessageDansConsole(id):sender; 

mais rien à faire.

 

J'imagine que je dois pouvoir faire un truc du genre

[testClasse.m envoyerMessageDansConsole];

Mais je bute sur la syntaxe.

 

Merci de votre aide.

Lien vers le commentaire
Partager sur d’autres sites

Hello,

 

La méthode que tu essaies d'appeler doit l'être depuis une instance de ta classe testClass (après un alloc/init).

Je pense que dans ton cas, il faut que tu utilises une méthode de classe et non une méthode d'instance, ce qui te permettra d'appeler ta methode comme ceci :

[TestClasse envoyerMessageDansConsole];

 

La declaration d'une methode de classe se fait avec un + au lieu du - des methodes d'instances.

+ (void)envoyerMessageDansConsole(id):sender;

 

J'espere que cela repond à ta question,

 

A+

Lien vers le commentaire
Partager sur d’autres sites

Hello et merci pour ta réponse !

 

Quand je fais :

+ (void)envoyerMessageDansConsole(id):sender;

Le debuggger me demande d'ajouter une virgule avant la parenthèse (id) et bien entendu si je le fais, ça marche pô :zz-big-blink:

Du coup j'ai fait un

+(void)envoyerMessageDansConsole;

 

Je vais essayer en instanciant ma classe… j'avais déjà cherché de ce coté-là mais sans succès…

Lien vers le commentaire
Partager sur d’autres sites

Vois les méthodes de classe comme l'équivalent d'une méthode static en POO.

En fait, jai copié, collé ton code mais je pense que la syntaxe est plutot celle la :

 

+ (void)envoyerMessageDansConsole:(id)sender secondParam:(Type *)name;

Les deux points se trouvent avant la declaration du type de ton parametre.

Lien vers le commentaire
Partager sur d’autres sites

Dans le fichier .h de mon testClasse, j'ai mis :

 

#import <Foundation/Foundation.h>

@interface testClasse : NSObject
+(void)envoyerMessageDansConsole:(id)sender;

@end

 

De le fichier .m de mon TestClasse, j'ai :

 

#import "testClasse.h"

@implementation testClasse


+(void)envoyerMessageDansConsole:(id)sender
{
NSLog(@"envoi message");
}

@end

 

 

Ensuite de la fichier .h de mon AppDelegate, j'ai :

 

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
- (IBAction)envoyerMessageConsole:(id)sender;

@end

 

Et dans le fichier .m dans mon AppDelegate, pour finir :

 

- (IBAction)envoyerMessageConsole:(id)sender {
   [testClasse envoyerMessageDansConsole];

}
@end

J'ai merdé où ?

Lien vers le commentaire
Partager sur d’autres sites

Tu n'as pas d'erreurs de compilation ou de warning ?

Il faut que tu lui relaie le parametre sender car la methode de classe de la classe testClasse n'est pas une IBAction donc c'est a toi de le faire manuellement.

Sur le reste l'organisation me semble correcte.

Lien vers le commentaire
Partager sur d’autres sites

Si j'ai un warning : dans mon IBAction, il me dit qu'il ne trouve pas la méthode '+envoyerMessageDansConsole'

 

Si je corrige dans mon IBAction en mettant ça :

[testClasse envoyerMessageDansConsole:sender];

 

ça marche !

 

Merci beaucoup ! Je n'aurais pas trouvé le coup du ":sender" tout seul… :zz-big-dingue:

 

Marrant : si dans mon testClasse .h je vire

 

+(void)envoyerMessageDansConsole:(id)sender;

ça marche quand même mais avec une erreur de "Semantic"

Lien vers le commentaire
Partager sur d’autres sites

Si je peux me permettre un conseil : ce n'est pas forcement le mieux d'envoyer le parametre sender directement a ta methode generique car si tu veux l'utiliser dans un autre contexte tu seras coincé ou obligé d'en creer une autre. Apres je ne sais pas quelle est le but de cette methode donc je peux me tromper.

 

C'est quoi ton erreur de semantic ? Souvent si tu ne declares pas les methodes dans le .h, XCode ne peut resoudre les liens directement donc il t'alerte comme quoi la methode peut ne pas exister. C'est parce que objective-c est un langage reflexif qu'il autorise ce genre de comportement.

Modifié par Killer
Lien vers le commentaire
Partager sur d’autres sites

Oui l'erreur de sémantic était liée à l'absence de la déclaration de ma méthode dans mon .h (je voulais juste voir ce que ça faisait si je ne la déclarait pas, ça a pas raté !)…

 

Le but de ce petit exo était justement de voir comment fonctionnait ce genre d'intéraction entre les classes et leurs appels… Rien de bien concret, c'est juste pour enrichir ma base de connaissance avant le grand saut de faire une application complète…

 

Merci encore de ton aide.

 

Effectivement il y a aucun intérêt à envoyer "sender" en paramètre, j'ai tout viré du coup… Je pensais que j'étais obligé d'envoyer un paramètre à ma méthode mais tout dépend comment je l'ai construite…

 

A l'origine il n'y avait pas de paramètre à passer à ma méthode mais mes différents tests m'ont amené à essayer d'envoyer un paramètre et du coup je l'ai laissé ce qui m'a encore plus embrouillé par la suite…

Lien vers le commentaire
Partager sur d’autres sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

Chargement
 Share

×
×
  • Créer...