Detecter un changement de NSTableView actif

22:46 modifié dans API AppKit #1
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.

Réponses

  • fouffouf Membre
    22:46 modifié #2
    Je pense a la solution suivante :

    Tu devient delegate des differents tableView et tu implemente shouldResignFirstResponder (ou - shouldResignFirstResponder) et -didBecomeFirstResponder :

    <br />-(BOOL)shouldResignFirstResponder{<br /><br />[unBouton setEnable:YES];<br />[autreBouton setEnable:NO];<br /><br />return YES;<br /><br />}<br />
    


    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 B)   :)beta:

    Tu pourras me dire ??
  • 22:46 modifié #3
    Hum,

    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.

  • 22:46 modifié #4
    Bon j'ai donc sous classé mes NSTableView en implémentant les méthodes suivantes uniquement (le code n'est pas de moi, je l'ai trouvé dans les archives d'une ml en anglais):

    <br />- (BOOL)becomeFirstResponder<br />{<br />	BOOL result = [super becomeFirstResponder];<br />	if (result) <br />	{<br />		if ([[self delegate] respondsToSelector:<br />			@selector(didBecomeFirstResponder:)]) <br />		{<br />			[[self delegate] didBecomeFirstResponder: self];<br />		}<br />	}<br />	return result;<br />}<br /><br />- (BOOL)resignFirstResponder<br />{<br />	BOOL result = [super resignFirstResponder];<br />	if (result) <br />	{<br />		if ([[self delegate] respondsToSelector:<br />			@selector(didResignFirstResponder:)]) <br />		{<br />			[[self delegate] didResignFirstResponder: self];<br />		}<br />	}<br />	return result;<br />}<br />
    


    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.
  • GercofisGercofis Membre
    22:46 modifié #5
    dans 1105691187:

    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).


    Un message envoyé depuis le délégate
    tableView:shouldEditTableColumn:row:
    ça doit le faire non ?
  • Eddy58Eddy58 Membre
    22:46 modifié #6
    Le delegate tableView:shouldEditTableColumn:row: sert dans le cadre d'édition de cellules dans la table view....certes si on édite une cellule dans la tableview effectivement celle-ci est active, mais cela ne couvre pas le cas de figure dans lequel on clique simplement sur la tableview (mettre le focus dessus en d'autres termes). :)
  • WIMPWIMP Membre
    22:46 modifié #7
    Il y a un message au delegate tableView:didClickTableColumn:
    ça devrait faire l'affaire non ?
  • BruBru Membre
    février 2005 modifié #8

    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.


    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.

    .
  • 22:46 modifié #9
    dans 1107618693:

    Il y a un message au delegate tableView:didClickTableColumn:
    ça devrait faire l'affaire non ?


    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).
  • 22:46 modifié #10
    dans 1107625357:


    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).


    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.
  • Eddy58Eddy58 Membre
    février 2005 modifié #11
    Sinon il y a un truc simple, c'est d'assigner une action à  chaque tableview (ou alors une action à  toutes les tableviews et comparer le sender ensuite), et quand tu cliques dans une tableview, l'action est donc appelée, signifiant que la tableview est le focus. Dans cette méthode, seules la cornerview et les scrollerviews restent insensibles aux cliques. :)
Connectez-vous ou Inscrivez-vous pour répondre.