Detecter un changement de NSTableView actif
aLittleWoodElfe
Membre
Bonjour,
Dans une de mes applications je veux activer ou désactiver des boutons en fonction de quel NSTableView de mon application est "actif".
Mais j'ai beau cherché je n'arriver pas à trouver un moyen de détecter l'activation de l'un des NSTableView (ie à détecter le fait qu'un utilisateur a cliqué dans le NSTableView).
Vous avez une idée ?
Merci d'avance.
Dans une de mes applications je veux activer ou désactiver des boutons en fonction de quel NSTableView de mon application est "actif".
Mais j'ai beau cherché je n'arriver pas à trouver un moyen de détecter l'activation de l'un des NSTableView (ie à détecter le fait qu'un utilisateur a cliqué dans le NSTableView).
Vous avez une idée ?
Merci d'avance.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Tu devient delegate des differents tableView et tu implemente shouldResignFirstResponder (ou - shouldResignFirstResponder) et -didBecomeFirstResponder :
et l'inverse dans didBecomeFirstResponder.
(je suis pas sur du tout des nom des methodes utilisées)
Si tu utilise des sous-classes de NSTableView, tu peux, a la limite
implementer ces methodes dans ta sous-classe avec des outlets vers tes boutons.
J'espere que ca marchera :)beta:
Tu pourras me dire ??
c'est ce que je comptais faire au départ mais il n'existe pas de méthodes delegates qui fassent ça.
Une solution serait effectivement de sous classer NSTableView et d'implémenter dans la sous classe ces deux méthodes... Mais je ne trouve pas ça trés élégant.
Je vais voir si je ne peux pas m'en sortir avec le delegate de NSApplication applicationDidUpdate:
....
Hum applicationDidUpdate permet bien de détecter le changement mais s'active aussi dès que je déplace la fenêtre de l'application et un passage d'un NSTableView à l'autre provoque 4 fois l'appel de cette méthode... Un peu trop de temps CPU perdu à mon goût.
Je crois que je vais revenir à une sous classe de NSTableView implémentant tes deux méthodes.
Ce code rajoute donc deux méthodes déléguées (didResignFirstResponder: et didBecomeFirstResponder: ) qu'il m'a suffit alors d'implémenter dans controller.
Un message envoyé depuis le délégate
tableView:shouldEditTableColumn:row:
ça doit le faire non ?
ça devrait faire l'affaire non ?
Moi, j'utiliserais la notification @NSWindowDidUpdateNotification qui est postée quand une NSWindow va se réafficher (ce qui est le cas, il faut masquer/réafficher le "focus ring" et il faut modifier les couleurs de la sélection active).
Voici un exemple dans mon controleur :
[tt]
#import "controleur.h"
@implementation controleur
- (void)awakeFromNib
{
[[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(updateButtons
 name:@NSWindowDidUpdateNotification
 object:wnd];
}
- (void)updateButtons:(NSNotification *)notification
{
[bt_1 setEnabled:([wnd firstResponder]==tb_1)];
[bt_2 setEnabled:([wnd firstResponder]==tb_2)];
}
@end
[/tt]
où tb_1 et tb_2 sont les outlets de mes 2 NSTableViews, et bt_1 bt_2 sont les 2 boutons qui doivent être actifs ou non en fonction de la NSTableView qui est "active". wnd est l'outlet de la fenêtre.
.
Et... non, j'ai testé et si je me souviens bien ça ne marchais que quand tu cliques sur la tête de la colonne (comme quand tu veux la sélectionner en entier).
Maintenant que j'ai implémenté la solution que j'ai donné plus haut j'ai la flemme de recommencer pour tester la tienne mais si je me retrouve confronté à la même question je ne manquerais pas de faire comme tu dit.