Appel de méthode
chaps31
Membre
Bon ça y est je (re)débute en Cocoa, je crée une classe, l'importe dans une autre hop appel une fonction de cette première classe dans la 2eme et .. marche pas...
Je sens que je vais être ridicule mais bon.
[Maclasse mamethode::];
en réponse "Maclasse not respond to +mamethode:"
NB : mamethode est bien déclarée dans Maclasse.h, implémentée dans Maclasse.m (2 arguments), j'importe bien Maclasse.h là où j'appel mamethode.
Vous connaissez une erreur de débutant qui entraine ça ? Sinon je copie mon (très court) code.
Merci
NB : Bon plus loin il me dit aussi qu'une sous-classe de NSWindowController ne répond pas à showWindow...
Je sens que je vais être ridicule mais bon.
[Maclasse mamethode::];
en réponse "Maclasse not respond to +mamethode:"
NB : mamethode est bien déclarée dans Maclasse.h, implémentée dans Maclasse.m (2 arguments), j'importe bien Maclasse.h là où j'appel mamethode.
Vous connaissez une erreur de débutant qui entraine ça ? Sinon je copie mon (très court) code.
Merci
NB : Bon plus loin il me dit aussi qu'une sous-classe de NSWindowController ne répond pas à showWindow...
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
dans MaClasse.h (et .m), quelle est le prototype de ta méthode ?
Est ce un + ou un - qui se trouve devant le nom de la méthode ?
Plusieurs erreurs dans la ligne que tu nous a mise :
- Tu appelles "mamethode" sur ta classe, Maclasse, et non sur une instance de Maclasse. C'est correct... mais seulement si mamethode est bien déclarée comme méthode de classe (avec un "+") et non une méthode d'instance (avec un "-" ) qui sont, elle, les plus courantes.
Je suppose que tu voulais plutôt faire une méthode d'instance qu'une méthode de classe (c'est le cas dans 98% des cas on va dire), dans ce cas vérifie que tu as bien mis un "-" et surtout appelle alors mamethode sur une instance de Maclasse et non sur la classe elle-même. Sinon si tu voulais vraiment faire une méthode de classe, là ok pour l'appeler direct sur la classe Maclasse, mais vérifie que tu as mis un "+" dans sa déclaration dans le .h (et dans son implémentation dans le ".m")
- Tu appelles "mamethode::" sans lui passer d'arguments... Déjà avoir deux ":" qui se suivent dans une déclaration, c'est louche (dans l'absolu c'est possible car Objective-C autorise à ne pas donner de nom/préfixe avant un paramètre, mais dans la réalité j'ai jamais vu ce genre de cas), mais dans un appel c'est pas possible.
Si tu as déclaré ta méthode comme prennant 2 arguments, il faut lui passer des arguments quand tu appelles cette méthode !
Bref tu as l'air de bien t'embrouiller, pour une reprise... et ton code, aussi court qu'il soit, nous permettrait de voir à quoi ressemble ce que tu as écrit et ce que tu veux faire... (au moins la déclaration dans le ".h") !
PS : Bon, No t'as fini de me griller quand je suis en train de répondre, oui ? ;D
En effet je m'y attendais je suis un tantinet ridicule...
Comme d'habitude un grand merci pour vos réponses.
Pour les curieux, ma classe ne sert qu'à une chose gérer les fenêtres de messages d'alertes et leurs conséquences, dans le cas précis après le ok je fais un [NSApp terminate:self]; mais ce n'est pas toujours le cas selon les messages, et pour l'affichage des messages il est certains que je ne ferais que des appels à des méthode de classe, sans instancier. Sauf si quelqu'un me dit "ttt... pas bien de faire comme ça.." :P
Encore merci
Soit une classe Maclasse, une variable d'instance NSMutableArray maTable.
Ma première utilisation de maTable dans une méthode de Maclasse est :
[maTable addObject:autreTable];
maTable sera en effet un tableau multidimensionnel. Si je remplace maTable par une variable NSMutableArray locale à la méthode pas de soucis elle se remplie sans problème, mais ma variable d'instance elle non elle reste désespéremment à NULL...
Corrigez-moi si je me trompe mais pas besoins de alloc-init pour une variable d'instance. Vraiment je ne vois pas pourquoi maTable reste désespèrément NULL, le code fonctionne puisque un tableau local lui se remplie je sens poindre une lacune de base sur les variables d'instances de classes que l'on cré.
Encore merci...
Eh bien, tu te trompes. >:D Les variables d'instances doivent bien être initialisées. On le fait d'ailleurs habituellement dans la méthode -[init].
Par contre, quand tu ajoutes un élement à un NSArray, cet élément reçoit automatiquement un -[retain]. Il reçoit évidemment un -[release] quand le NSArray est détruit.
Je voulais écrire:
"Les objets en variables d'instances doivent bien être alloués et initialisées."
Je vous soumet une question ici car c'est une histoire de méthodes et ça évite de créer (encore) un nouveau post :P
Mon projet va avoir plusieurs comboBox (idem pour les tableView), pas toutes dans la même fenêtre, j'ai créé une classe Clas1 qui implémente les 2 méthodes de datasource pour comboBox, l'idée est d'instancier cette classe via une autre Clas2 (ma classe qui gère l'interface), cette autre classe fournis les valeurs (nbre de lignes et tableau de lignes du combobox) via des méthodes de Clas1 appelées dans Clas2 pour l'instance qu'elle crée.
Le but de tout cet embroglio : éviter les tag dans ma classe de gestion d'interface avec des ifs dans les méthodes datasource.
Bon, ça ne marche pas :P, mais la question n'est pas un SOS, juste un : est-ce une bonne idée ? Ou bien faut-il que je me résigne à créer les méthode datasource dans ma classe de gestion d'interface avec des "ifs" selon la comboBox qui appelle ses méthodes. Si cette dernière solution ne pose pas de problème de programmation (contrairement à celle que je veux mettre en place) je la trouve beaucoup moins élégante et moins POO avec un code pas terrible à voir...
Donc votre avis sur la bonne manière d'aborder le datasource, une classe qui implémente les méthodes obligatoires que l'on instancie dans une classe qui gère l'interface ou bien tout dans une seule classe de gestion d'interface et des tag sur les combobox...
Merci, j'espère avoir été à peu près clair. ???
Ou sinon on peut bien souvent éviter tout un tas de "ifs" grace au KVC (Key-Value Coding)
Ou alors tu mets chacun de tes tableaux correspondant à ton modèle dans un NSDictionary, donc la clé de chaque entrée correspond au tag de ta combobox dans IB (et l'entrée correspondante contient le NSArray correspondant au modèle de cette combobox)
C'est dommage parce que pour les colonnes des NSTableViews on a les "identifier" pour les colonnes et c'est bien pratique... Après tu peux toujours sous-classer NSComboBox pour lui rajouter une variable genre "identifier" de type NSString mais bon.