使用按键从tableview中删除条目

时间:2011-10-28 13:14:21

标签: cocoa delegates tableview nstableview

我有一个简单的cocoa应用程序,其中一个表视图显示了一些条目。我希望用户只需在表格中选择并按“删除”即可删除他想要的任何条目。如何检测“删除”的按键,以及当用户在tableview中选择一个条目时如何知道它是否出现?

**编辑:如果我没说清楚,“删除”是指mac键盘上的退格键,而不是GUI按钮。

4 个答案:

答案 0 :(得分:3)

对表视图进行子类化,并在按下删除时让它发送其委托事件。

<强> MyTableView.h:

@interface MyTableView : NSTableView

@end

@protocol MyTableViewDelegate <NSTableViewDelegate>

-(BOOL)deleteKeyPressedForTableView:(MyTableView *)tableView;

@end

<强> MyTableView.m:

+(unichar)firstCharPressedForEvent:(NSEvent *)theEvent {
    if (![[theEvent characters] length]) return -1;
    return [[theEvent characters] characterAtIndex:0];
}

+(BOOL)eventIsDeleteKeyPressed:(NSEvent *)theEvent {
    switch ([MyTableView firstCharPressedForEvent:theEvent]) {
        case NSDeleteFunctionKey:
        case NSDeleteCharFunctionKey:
        case NSDeleteCharacter:
            return YES;
        default:
            return NO;
    }
}

-(void)keyDown:(NSEvent *)theEvent {
    if ([MyTableView eventIsDeleteKeyPressed:theEvent])
        if ([[self delegate] respondsToSelector:@selector(deleteKeyPressedForTableView:)])
            if ([(id<MyTableViewDelegate>)[self delegate] deleteKeyPressedForTableView:self])
                return;

    // The delegate wasn't able to handle it
    [super keyDown:theEvent];
}

表格视图的委托:

- (BOOL)deleteKeyPressedForTableView:(MyTableView *)tableView {
    // check if row is selected
    if (no_row_selected) return NO;
    // handle deletion
    if (error_condition) return NO;    
    return YES;
}

答案 1 :(得分:1)

另一种选择是只将等效键(键盘快捷键)指定给“编辑”菜单的“删除”项,并将其操作设置为控制器的delete:方法。

答案 2 :(得分:0)

如果您只有一个表,更简单的解决方案是在窗口控制器或视图控制器中实现一些NSResponder方法:

- (void)keyDown:(NSEvent *)event
{
    [self interpretKeyEvents:@[event]];
}

- (void)deleteBackward:(id)sender
{
    // use the tableView's selectedRow to determine what/if to delete
}

答案 3 :(得分:0)

这是@paulmelnikow给出的答案的Swift 4版本。

protocol MyTableViewDelegate: NSTableViewDelegate {
    func deleteKeyPressed(for tableView: MyTableView)
}

class MyTableView: NSTableView {
    override func keyDown(with event: NSEvent) {
        guard let myDelegate = delegate as? MyTableViewDelegate, deletePressed(event: event) else {
            super.keyDown(with: event)
            return
        }

        myDelegate.deleteKeyPressed(for: self)
    }

    fileprivate func deletePressed(event: NSEvent) -> Bool {
        guard let firstChar = event.characters?.first, let uniScalar = firstChar.unicodeScalars.first else {
            return false
        }

        let char = Int(uniScalar.value)

        switch char {
        case NSDeleteFunctionKey, NSDeleteCharFunctionKey, NSDeleteCharacter:
            return true
        default:
            return false
        }
    }
}