Удаление записей из таблицы с помощью нажатия клавиш - PullRequest
0 голосов
/ 28 октября 2011

У меня есть простое приложение какао с табличным представлением, отображающим несколько записей.Я хочу, чтобы пользователь мог удалить любую запись, которую он хочет, просто выбрав ее в таблице и нажав «Удалить».Как обнаружить нажатие клавиши «Удалить» и как узнать, происходит ли это, когда пользователь выбрал запись в табличном представлении?

** Правка: если я еще не дал понять,Удалить "относится к клавише возврата на клавиатуре Mac, а не к кнопке графического интерфейса пользователя.

Ответы [ 4 ]

3 голосов
/ 29 октября 2011

Создает подкласс табличного представления и отправляет ему события делегата при нажатии на удаление.

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 голос
/ 29 октября 2011

Другой вариант - просто назначить эквивалент клавиши (сочетание клавиш) для пункта «Удалить» в меню «Правка» и установить его действие для метода delete: вашего контроллера.

0 голосов
/ 04 марта 2019

Вот версия Swift 4 ответа, который дал @paulmelnikow.

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
        }
    }
}
0 голосов
/ 26 апреля 2017

Если у вас есть только одна таблица, более простое решение - реализовать несколько NSResponder методов в вашем контроллере окна или контроллере представления:

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

- (void)deleteBackward:(id)sender
{
    // use the tableView's selectedRow to determine what/if to delete
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...