# Gestion des évènements XCode



## dguillet (7 Juillet 2012)

Bonjour,
     Après vérification via le moteur de recherche et surtout via Google, je ne trouve pas de réponse avec exemple à mon problème.

     Ce que je cherche à faire c'est simplement capturer les évènements sur un NSTableview et dissocier le traitement d'un clic souris sur un élément d'un appuie sur une des touches du clavier.

     La méthode que j'utilise est la création d'une class myNSTableView dérivé d'un NSTableView dans laquelle j'ai réécris les méthodes 

- (void) mouseDown: (NSEvent*) theEvent;
- (void)keyDown: (NSEvent* )theEvent;
- (void) rightMouseDown: (NSEvent *)theEvent;

Certes cela fonctionne mais cela ne rends pas le code portable d'OSX  vers iOS.


J'ai cru comprendre dans la litérature sur le web qu'il existe donc la classe NSNotificationCenter cependant je n'arrive pas correctement à saisir la subtilité de la chose. 

admettons que je maTableView soit un Iboutlet référençant ma tableView et maTableViewClick la methode que je souhaite déclencher en cas de click sur la tableView

La question est comment m'y prendre pour:
   1 - créer une instance de NSNotification center pointant sur la tableview
   2 - faire en sorte d'associer ma methode au click souris sur ce notification center 

Voici ce que j'essaye malheureusement sans succès :

[[NSNotificationCenter defaultCenter] addObserver:maTableView selectorselector(maTableViewClick: ) name"NSLeftMouseDown" object:nil]; 

Auriez-vous une idée?

Merci

David


----------



## ntx (7 Juillet 2012)

Les notifications sont indépendantes des événements. C'est dans tes fonctions mouseDown ou keyDown qu'il faut envoyer ta notification et tu mets ton code commun à OSX et iOS dans le traitement de la notification.


----------



## dguillet (7 Juillet 2012)

ntx a dit:


> Les notifications sont indépendantes des événements. C'est dans tes fonctions mouseDown ou keyDown qu'il faut envoyer ta notification et tu mets ton code commun à OSX et iOS dans le traitement de la notification.



Merci de ta réponse cependant tu as ajouté un peu plus de confusion dans mon esprit :rose:

Celà implique donc la surcharge de la classe Tableview pour gérer mes propre évènements mousedown et keypress et dedant j'envois une notification? 

il n'y a pas dautre méthode ?

Merci


----------



## ntx (7 Juillet 2012)

Tu peux éviter de dériver ta classe NSTable si le comportement qui t'intéresse est géré par le "delegate". Regarde la fonction "tableView:shouldTypeSelectForEvent:withCurrentSearchString:" dans le protocole "NSTableViewDelegate". Je ne l'ai jappais essayé.


> Discussion
> Typically, this is called from the table view keyDown: implementation and the event will be a key event.


----------



## tatouille (8 Juillet 2012)

exactement les objets tables te demandent un delegate et un datasource ne jamais utiliser ton main controller pour etre a la fois datasource et delegate prefere deux "smart callback" de plus étendre des objets par nature cela s'appele la programmation Objet c'est pour cela que cela a ete inventé mais cocoa est tres bien fait sur ce point car les objets utilises des delegates/callbacks a toi de definir les interfaces/protocols et les traitements discrets dans 99% des cas ca evite d'etendre  des objets natifs


----------



## dguillet (9 Juillet 2012)

Bonjour,
   Merci à vous c'est en effet un peu plus clair pour moi maintenant. 
   Les notifications sont en fait des messages que l'on envois à différents observateurs charge à ses observateurs de gérer la notification.

   Il semblerait que la gestion des évènements mouseDown keyPressed par un NSTableViewDelegate soit la solution plutôt que de faire une surcharge de la classe NSTableView. 


Je vais regarder dans ce sens. 

David


----------



## dguillet (9 Juillet 2012)

Je le réponds donc à moi même 

Donc en effet le delegate et nsnotification sont la solution.

Je m'explique

si je veux appliquer un traitement spécifique sur maTableView, je créer une classe délégué de NSTableView :

@interface tableViewdelegue : NSObject <NSTableViewDelegate>


Pour gérer la selection d'un élément j'utilise la méthode du protocol NSTableViewDelegate tableViewSelectionDidChange :

- (void)tableViewSelectionDidChange: (NSNotification *)aNotification;
{
   Code spécifique pour le traitement du changement de la sélection.

   Si besoin je peux ici créer ma propre notification et l'envoyer au centre de notification 

}


Dans le code de l'applicationdelegate.m je fais en sorte que l'application surveille les notification de type tableViewSelectionDidChange en provenance de maTableView  et si on obtient cette notification on execute la méthode gestionnaire:

    [ [ NSNotificationCenter defaultCenter ] addObserver: self selector: @selector( gestionnaire: ) name: NSTableViewSelectionDidChangeNotification object: afficheurUtilisateur ];


Ainsi lorsque je selectionne un ligne sur maTablView je peux faire ce que je veux et surtout je récupère la notification comme quoi la sélection a changée au niveau de mon application et du coup je peux executer des actions sur d'autres objet Nsarraycontroller par exemple. 

Encore merci pour les pistes.

David


----------

