8
votes

Comment mettre à jour Nsmenu pendant qu'il est ouvert?

J'ai un nsmenu avec des Nsmenuitems ajoutés dynamiquement. Le Nsmenu n'est pas rafraîchissant correctement pendant qu'il est tenu ouvert. Je appelle la méthode de mise à jour NSMENU dans nsventtrackingrunloopmodes code>.

J'ai mis en œuvre des méthodes suivantes pour mettre à jour NSMENU. P>

- (void)menuNeedsUpdate:(NSMenu *)menu {
for (NSInteger index = 0; index < count; index++)
    [self menu:menu updateItem:[menu itemAtIndex:index] 
                       atIndex:index 
                  shouldCancel:NO];
}

- (BOOL)menu:(NSMenu *)menu updateItem:(NSMenuItem *)item atIndex:(NSInteger)index shouldCancel:(BOOL)shouldCancel`

- (NSInteger)numberOfItemsInMenu:(NSMenu *)menu


1 commentaires

J'ai une question similaire. Je voudrais mettre à jour le NSMENU lorsqu'il est ouvert selon que l'utilisateur appuie sur la touche Option. Le comportement dont j'ai besoin pour quel Xcode fait lorsque le menu du produit est ouvert et que la touche d'option est enfoncée. Cela peut-il être fait avec les méthodes intégrées NSMENU?


3 Réponses :


0
votes

Vous avez laissé un tas de code. Cependant, vous n'êtes pas censé appeler -Menu: updateItem: AttinDex: Député: . C'est une méthode que vous êtes censé mettre en œuvre et que le cadre est censé l'appeler.

En outre, vous ne supposez généralement pas mettre en œuvre -MenuneedsUpdate: ou tous les deux -NumberofitemSinmenu: et -Menu: up upountItem: AttinDex: Député: . La mise en œuvre des trois n'a pas beaucoup de sens. Vous implémentez le premier si vous pouvez créer le menu immédiatement. Vous implémentez ces deux derniers si la construction du menu prendra du temps.

Enfin, toutes ces méthodes sont documentées comme étant appelées "lorsqu'un menu est sur le point d'être affiché". Je ne suis pas terriblement surpris qu'ils ne soient pas appelés à plusieurs reprises lorsque le menu est ouvert.

Si vous connaissez le menu doit être mis à jour, vous pouvez essayer d'appeler - [NSMENU Update] . Cela peut provoquer cela pour appeler vos méthodes de délégation. Je suis sûr que vous pouvez également appeler simplement les méthodes sur nsmenu et nsmenuitem pour modifier le menu, sans attendre que votre délégué soit appelé.


3 commentaires

[NSMENU Update] n'appelle aucune méthode de délégué. Je peuploie de manière dynamique les éléments de menu dans une minuterie et NsMenu ne met pas à jour lorsqu'il est ouvert.


Il ne met pas à jour même si vous invoquez des choses comme - [nsmenu additem:] ou - [Nsmenuitem Settitle:] en réponse à votre minuterie? Je suis sûr que j'ai vu des menus à jour pendant qu'ils sont ouverts, il est donc possible.


@Kenthomases La première partie de l'horloge fait cela (il est plus visible si vous affichez des secondes).



5
votes

Je suis de manière dynamique des éléments de menu dans une minuterie et NSMENU ne met pas à jour lorsqu'il est ouvert.

Assurez-vous d'avoir le feu de la minuterie sur le mode de course correspondant: xxx

Vous ne pouvez avoir peut-être que le feu sur nsdefaultrunloopmode en ce moment. < / p>


1 commentaires

J'ai essayé d'utiliser nsrunloopcommonModes mais je reçois toujours le menu de la question rafraîchissante alors qu'il est ouvert



7
votes

Mise à jour des éléments de menu dans NSVENTTrackingRunloopMode a résolu ce problème.


0 commentaires