Appel de méthode

chaps31chaps31 Membre
10:53 modifié dans API AppKit #1
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...

Réponses

  • NoNo Membre
    10:53 modifié #2
    Question :
    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 ?
  • AliGatorAliGator Membre, Modérateur
    10:53 modifié #3
    Heu c'est quoi le prototype de "mamethode" ?

    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
  • chaps31chaps31 Membre
    10:53 modifié #4
    Mais non, mais non je ne m'embrouille pas tant que ça en fait, j'avais un tantinet omis la différence entre méthode d'instance et méthode de classe.... Car en effet j'ai toujours utilisé des méthodes d'instances et cette fois il me faut des méthodes de classes. Un "+" plus tard est tout est rentré dans l'ordre, donc

    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
  • chaps31chaps31 Membre
    10:53 modifié #5
    Bon comme un instant de ridicule ne vient jamais seul, je vous soumet un nouvel "arrachage de cheveux". Je sens encore que je vais voir une lacune de base se combler...  :o

    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...
  • CéroceCéroce Membre, Modérateur
    10:53 modifié #6
    Corrigez-moi si je me trompe mais pas besoins de alloc-init pour une variable d'instance.


    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.
  • CéroceCéroce Membre, Modérateur
    10:53 modifié #7
    Les variables d'instances doivent bien être initialisées.

    Je voulais écrire:
    "Les objets en variables d'instances doivent bien être alloués et initialisées."
  • chaps31chaps31 Membre
    10:53 modifié #8
    Bon, il faut que j'arrête de me poser des questions métaphysique si j'utilise une instance de classe, ben faut instancier l'objet... Merci de ta réponse, évidemment ça marche (ou presque mais autre problème que je vous épargne)
  • AliGatorAliGator Membre, Modérateur
    10:53 modifié #9
    Et bien sûr pour rester logique, puisque tu alloues ton NSMutableArray variable d'instance dans ton init, pense à  le releaser dans ton dealloc !
  • chaps31chaps31 Membre
    10:53 modifié #10
    Et il faut que je potasse la gestion de la mémoire, je sens que je vais laisser faire le ramasse-miettes...

    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.  ???
  • AliGatorAliGator Membre, Modérateur
    décembre 2008 modifié #11
    Pourquoi tu n'utilises pas des dataSources différents pour tes différentes comboBoxes ?

    Ou sinon on peut bien souvent éviter tout un tas de "ifs" grace au KVC (Key-Value Coding)
  • chaps31chaps31 Membre
    10:53 modifié #12
    KVC (merci pour le lien) je l'utilise pour les tableview mais pour les combobox ? Je sens que mon idée n'est pas bonne...
  • AliGatorAliGator Membre, Modérateur
    10:53 modifié #13
    Heu je sais pas trop ça fait un bail que j'ai pas codé des comboboxes, mais une variable d'instance (contenant ton modèle, typiquement par exemple j'imagine un NSArray des valeurs à  afficher dans ta ComboBox ?) par combobox à  gérer, donc le nom correspond au tag de ta combobox dans IB ?
    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)
    - (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {<br />&nbsp; NSArray* model = [dicoOfModels objectForKey: [aComboBox tag]];<br />&nbsp; [model objectAtIndex:index];<br />}
    
  • chaps31chaps31 Membre
    10:53 modifié #14
    Le Tag est un chiffre... Je peux toujours appelé mon tableau "0"... Il y a un moyen d'obtenir autre chose qu'un tag pour une  combobox (nom, identification...)?
  • AliGatorAliGator Membre, Modérateur
    10:53 modifié #15
    dans 1229707997:

    Le Tag est un chiffre... Je peux toujours appelé mon tableau "0"... Il y a un moyen d'obtenir autre chose qu'un tag pour une  combobox (nom, identification...)?
    Ah oui pardon, c'est pas la première fois que je me fais avoir en plus à  penser que "tag" est une NSString, désolé :-/ Je toruve ça bien dommage que ce soit un entier... en plus par défaut il vaut zéro, ce qui fait qu'on ne peux pas trop utiliser cette valeur car du coup il risque d'y avoir pas mal d'objets tagués 0...

    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.
  • chaps31chaps31 Membre
    10:53 modifié #16
    Je suis bien d'accord avec toi, espérons que steve nous lise  :P
Connectez-vous ou Inscrivez-vous pour répondre.