2009-12-28 9 views
1

Je suis novice dans la programmation Obj-C/Cocoa et j'ai un problème pour ajouter dynamiquement des éléments de menu à une instance NSMenu et avoir le sélecteur d'action des éléments déjà défini lors de l'insertion .Ajout d'un élément à NSMenu avec préréglage de sélecteur d'action

Je peux, ajouter les éléments de menu dynamique très bien, mais le sélecteur d'action ne se déclenche pas lorsque l'élément est cliqué via le menu.

La première ligne ci-dessous est la ligne de code que j'utilise pour ajouter l'élément de menu. Vous pouvez définir que je mets l'action: (SEL) aSelector à la fonction "openEchowavesURL".

Cette fonction se trouve dans le même fichier de classe de contrôleur et j'ai inclus la définition de fonction ci-dessous. Est-ce que j'appelle juste la mauvaise syntaxe de sélecteur ou quelque chose? Ou quel est le truc pour obtenir l'élément de menu pour appeler un sélecteur lorsque vous cliquez dessus?


[statusMenu insertItemWithTitle:[NSString stringWithFormat:@"%d - %@", convo.newMessagesCount, convo.ewName] action:@selector(openEchowavesURL:) keyEquivalent:@"" atIndex:0]; 

- (void)openEchowavesURL:(id)sender { 
    // function details here 
} 

Répondre

11

Si vous voulez que l'action soit déclenchée contre votre objet, vous devez spécifier une cible pour la nouvelle NSMenuItem:

NSMenuItem *item = [statusMenu insertItemWithTitle:[NSString stringWithFormat:@"%d - %@", convo.newMessagesCount, convo.ewName] action:@selector(openEchowavesURL:) keyEquivalent:@"" atIndex:0]; 
[item setTarget:self]; // or whatever target you want 

Si vous ne le faites pas, alors la chaîne NSResponder sera piétiné jusqu'à ce que un objet répond au sélecteur.

+1

merci. Donc, si la chaîne est parcourue, alors pourquoi le sélecteur n'est-il pas trouvé dans ma classe de contrôleur actuelle? Pourquoi ai-je besoin de spécifier manuellement l'auto dans ce cas? – cpjolicoeur

+1

Vous devez répondre à certains critères afin d'être interrogé lors de la recherche. Je vous suggère de lire le guide suivant pour comprendre comment: http://developer.apple.com/mac/library/DOCUMENTATION/Cocoa/Conceptual/EventOverview/index.html#//apple_ref/doc/uid/10000060i –

+0

Votre contrôleur ne fait probablement pas partie de la chaîne du répondeur. –

1

actions ont besoin d'une cible ou bien ils sont envoyés à zéro puis des nouvelles règles.

+0

pouvez-vous expliquer cela un peu plus? Je ne pense pas que je suis. Je règle l'action sur le sélecteur que je veux sur l'élément de menu inséré. Que dois-je faire d'autre pour définir une cible? – cpjolicoeur

+1

Envoyez à l'élément un message setTarget. –

+0

Si vous envoyez une action à zéro (NULL), alors le firstResponder sera utilisé (si possible). En tri: Pour laisser la fenêtre du premier plan gérer l'action, définissez la cible sur NULL. Dans Interface Builder, vous ajoutez des actions à la classe FirstResponder, puis reliez directement les actions à l'instance firstResponder à la place de vos propres objets. -Alors souvent c'est une bonne idée (en particulier pour les éléments de menu) de définir la cible à NULL. Souvenez-vous que vous pouvez également utiliser 'the representsObject' pour conserver des références à des données/objets. –

Questions connexes