关于Objective C:覆盖keyDown导致NSTableView出现问题

Overriding keyDown causes issues to a NSTableView

在我的NSTableView子类MyTableView中,我已覆盖

1
2
3
4
5
6
7
8
- (void) keyDown:(NSEvent *)event {

    if ( [event keyCode] == 51 || [event keyCode] == 117 ) {
        [super keyDown:event];
        return;
    }

}

51是删除按钮的代码。我希望表格视图能够像子类化之前一样删除选定的项目。

已正确捕获事件,并调用了超类的keyDown方法。但是,该项目不再被删除。为什么?

谢谢


建议您在窗口类中覆盖keyDown:。

1
2
3
4
5
6
7
8
9
10
11
12
13
-(void) keyDown: (NSEvent *) event
{
    NSString *chars = [event characters];
    unichar character = [chars characterAtIndex: 0];
    if (character == NSDeleteCharacter || character == NSBackspaceCharacter)
    {
        NSTableView* view = (NSTableView*)[self firstResponder];
        if(view == theTableView)
        {
        // do something to delete the item from your data model and reload the tableview
        }
    }
}


如果您只想在按下Delete键时调用特定方法,则建议您覆盖-deleteBackward:方法(NSResponder的一部分),因为它可以更具体地隔离这种拦截。它还管理重新映射的键盘,宏等问题。

还有-deleteForward作为删除键,而不是Backspace键。

1
2
3
4
5
6
-(void)deleteBackward:(id)sender
{
     // do my override here
     // do this only if super implements deleteBackward:
     [super deleteBackward: sender]
}