Enlever/remettre un item de menu

tabliertablier Membre
10:32 modifié dans API AppKit #1
J'ai un bouton popup à  quatre items de menu. Je veux enlever ou remettre le dernier item du menu.
Quand je le remets, j'ai trouvé que je devais utiliser setTarget: puis setAction:
[leMenuItem  setTarget:lobject_qui_contient_la_methode] ;
[leMenuItem  setAction:@selector(la_methode:)] ;
Cela marche bien. Mais y-a-t-il des précautions à  prendre quand je supprime le menuItem ?
D'autre part, dans l'exemple d'Apple (prefsPane) la_methode est bien présente dans le .m sous la forme:
- (IBAction)la_methode:(id)sender
{ . . . . . le texte de la méthode . . . . }
Mais cette méthode n'est pas déclarée dans le .h, est-ce bien normal ?

Réponses

  • 10:32 modifié #2
    dans 1312213944:

    J'ai un bouton popup à  quatre items de menu. Je veux enlever ou remettre le dernier item du menu.
    Quand je le remets, j'ai trouvé que je devais utiliser setTarget: puis setAction:
    [leMenuItem  setTarget:lobject_qui_contient_la_methode] ;
    [leMenuItem  setAction:@selector(la_methode:)] ;
    Cela marche bien. Mais y-a-t-il des précautions à  prendre quand je supprime le menuItem ?

    Mis à  part supprimer l'item.. non.
    Mais ta méthode "d'ajout" me semble bizarre.. Tu es sûr d'avoir supprimé l'item en question via -removeItem: (NSMenu)?
    Sinon tu peux "désactiver" l'item en mettant son action à  NULL.

    dans 1312213944:

    D'autre part, dans l'exemple d'Apple (prefsPane) la_methode est bien présente dans le .m sous la forme:
    - (IBAction)la_methode:(id)sender
    { . . . . . le texte de la méthode . . . . }
    Mais cette méthode n'est pas déclarée dans le .h, est-ce bien normal ?

    Oui,.. et non. En tout logique on devrait la déclarer dans le .h, ou bien dans un @interface private dans l'implémentation... c'est ce qu'on pourrait appeler une précaution. Si jamais tu vires la méthode par erreur, tu n'auras pas de warning à  la compilation car tu n'appelles pas explicitement la-dite méthode. Ceci-dit, si tu testes ton application tu remarqueras un plantage.

  • tabliertablier Membre
    10:32 modifié #3
    Mis à  part supprimer l'item..
    c'est un autre contrôle qui permet de supprimer (via removeItemAtIndex:) et remettre l'item. Et je veux le supprimer/remettre et non pas le désactiver. L'effet pour l'utilisateur n'est pas le même!
      ???  C'est étonnant qu'Apple n'ait pas pris de précaution au niveau de la déclaration!! 
    Si je comprends bien ce que tu dis: si une méthode n'est pas appelée directement on peut ne pas la déclarer dans un .h, mais le compilateur connait quand même son sélecteur. Donc, bien que non déclarée on peut quand même l'appeler!
  • cyranocyrano Membre
    10:32 modifié #4
    uniquement si elle est appelée dans la meme unité de compilation (meme fichier) et est placée avant l'appel, je pense.
  • août 2011 modifié #5
    J'ai envie de dire que les déclarations de méthodes dans l'interface d'une classe ne servent qu'à  suivre une conformité.
    <br />@interface Toto : NSObject<br />@end<br /><br />@implementation Toto<br />- (void)awakeFromNib<br />{<br />	[self doSomething];<br />}<br /><br />- (void)doSomething<br />{<br />	NSLog(@&quot;Yo&quot;);<br />}<br /><br />@end<br />
    


    Là  tu as simplement un warning, mais rien qui empêche le fonctionnement. La méthode est correctement appelée
    Place - (void)doSomething avant -(void)awakeFromNib, et le warning disparaà®t, car le compilo aura pris en compte son existence avant la ligne où tu l'appelles.


    La raison pour laquelle tu n'as pas de warning à  setAction: c'est simplement parce que la méthode n'est pas appelée à  ce moment là , et que tu ne l'appelles nul part explicitement.
    Bien sûr, si le compilo était un peu plus intelligent, il te l'aurait signalé.. mais bon peut-être qu'on en demande trop :p

Connectez-vous ou Inscrivez-vous pour répondre.