2010-12-14 74 views
0

我有一個NSTableView與行數。 allowsEmptySelection屬性是NO,所以總是選擇一行。按照預期,我可以使用箭頭鍵在桌面視圖中上下移動。在NSTableView中用'j'和'k'模擬箭頭鍵?

我也想用'j'和'k'鍵來上下移動。我看過Cocoa Event-Handling Guide,但無法弄清楚如何讓這些鍵模擬上下方向鍵。

爲什麼它的價值,這是我目前正在做的。我並不是真的在「模擬箭頭鍵」。相反,當我按'j'和'k'時,我只是做我想要的行爲。這很好,但我想知道是否有更好的方法...

- (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]; 
    } 
} 

回答

2

創建NSTableView的自定義子類來捕獲事件。子類應該有這樣的方法吧:

- (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]; 
} 

這將捕獲任何J或K鍵,並告訴表視圖或分別上下移動。另外,如果按下Shift鍵,則會向上或向下添加選擇。

如果您選擇使用此代碼,請確保過濾掉其他修飾符是否被按下並將它們傳遞給超級。我沒有這樣做,使其更具可讀性。

編輯:如何創建一個虛假的事件

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

我嘗試這樣做,但我得到這個錯誤: - [MyTableView爲moveUp:]:無法識別的選擇發送到實例0x100148270。顯然它找不到-moveUp/-moveDown。任何想法? – sam 2010-12-14 01:04:28

+0

請注意'moveUp:'是不同於'moveUp'的方法名稱(不帶冒號)。 ughoavgfhw的示例代碼假定您已經定義了像' - (void)moveUp:(id)sender'和' - (void)moveDown:(id)sender'這樣的方法。 – NSGod 2011-01-16 02:50:51

+0

@NSGod:它們是用於處理箭頭鍵的預定義方法,而不是假設。 NSTableView不得使用它們。你可以嘗試使用箭頭鍵代碼創建一個假事件並將其傳遞給超級(我將在更新中展示它的方式)。 – ughoavgfhw 2011-01-16 05:29:12