2010-12-14 48 views
0

J'ai un NSTableView avec un certain nombre de lignes. La propriété allowEmptySelection est NO, donc il y a toujours une ligne sélectionnée. Je peux monter et descendre la tableview avec les touches fléchées comme prévu.Simuler les touches fléchées avec 'j' et 'k' dans une NSTableView?

J'aimerais aussi pouvoir monter et descendre avec les touches 'j' et 'k'. J'ai regardé le Cocoa Event-Handling Guide, mais je n'arrive pas à comprendre comment faire pour que ces touches simulent les flèches haut et bas.

Pour ce que ça vaut, voici ce que je suis en train de faire. Je ne suis pas vraiment en train de 'simuler les touches fléchées'. Au contraire, je fais juste le comportement que je veux quand «j» et «k» sont pressés. Il est très bien, mais je me demande s'il y a une meilleure façon ...

- (void)keyDown:(NSEvent *)theEvent { 
    NSInteger row = [self.tableView selectedRow]; 
    NSInteger numRows = [self.tableView numberOfRows]; 
    switch ([theEvent keyCode]) { 
     case 38: // 'j' 
      if (row < numRows - 1) { 
       [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row+1] byExtendingSelection:NO]; 
      } 
      break; 
     case 40: // 'k' 
      if (row > 0) { 
       [self.tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:row-1] byExtendingSelection:NO]; 
      } 
      break; 
     default: 
      [super keyDown:theEvent]; 
    } 
} 

Répondre

2

Créer une sous-classe personnalisée de NSTableView pour attraper les événements. Votre sous-classe devrait avoir cette méthode en elle:

- (void)keyUp:(NSEvent *)event { 
    if([event keyCode] == 26) {//J 
     if([event modifierFlags] & NSShiftKeyMask) [self moveDownAndModifySelection:nil]; 
     else [self moveDown:nil]; 
    } else if([event keyCode] == 28) {//K 
     if([event modifierFlags] & NSShiftKeyMask) [self moveUpAndModifySelection:nil]; 
     else [self moveUp:nil]; 
    } else [super keyUp:event]; 
} 

Cela attraper les clés de J ou K et dire la vue de la table pour déplacer vers le haut ou vers le bas, respectivement. De plus, si vous appuyez sur la touche Maj, cela ajoutera à la sélection vers le haut ou vers le bas.

Si vous choisissez d'utiliser ce code, assurez-vous de filtrer si d'autres modificateurs sont enfoncés et passez-les à super aussi. Je n'ai pas fait ça pour le rendre plus lisible.

Edit: Comment créer un événement faux

unichar theChar = NSUpArrowFunctionKey; //NSDownArrowFunctionKey 
NSString *string = [NSString stringWithCharacters:&theChar length:1]; 
NSEvent *newEvent =[NSEvent keyEventWithType:NSKeyUp location:[event locationInWindow] modifierFlags:[event modifierFlags] timestamp:[event timestamp] windowNumber:[event windowNumber] context:nil/*get graphics context if you want*/ characters:string charactersIgnoringModifiers:string isARepeat:[event isARepeat] keyCode:theChar]; 
[super keyUp:newEvent]; 
+0

J'ai essayé, mais je reçois cette erreur: - [MyTableView moveUp:]: sélecteur non reconnu envoyé à l'instance 0x100148270. Apparemment, il ne peut pas trouver -moveUp/-moveDown. Une idée? – sam

+0

Notez que 'moveUp:' est un nom de méthode différent de 'moveUp' (sans les deux-points). L'exemple de code de ughoavgfhw suppose que vous avez défini les méthodes comme '- (void) moveUp: (id) sender' et' - (void) moveDown: (id) sender'. – NSGod

+0

@NSGod: Ce sont des méthodes prédéfinies pour gérer les touches fléchées, pas des hypothèses. NSTableView ne doit pas les utiliser. Vous pouvez essayer de créer un faux événement avec des codes de touches fléchées et le passer en super (je vais montrer comment dans une mise à jour). – ughoavgfhw