Эквивалент ключа переопределения для NSButton в NSTextField

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


person The Wanderer    schedule 14.11.2012    source источник


Ответы (2)


Вы можете переопределить beFirstResponder: и в своей реализации вызвать setKeyEquivalent:. Если вы хотите удалить эквивалент ключа, когда кнопка теряет статус первого ответившего, переопределите resignFirstResponder:.

Сделайте это в элементе управления, статус первого респондента которого вы хотите изменить на эквивалент кнопки. Например, если у вас есть представление в виде контейнера, и оно может стать первым ответчиком, вы должны переопределить -becomeFirstResponder: (вызов super), а затем управлять там эквивалентом кнопки. Если вы еще не разбираетесь в этих темах, вам нужно прочитать много обязательных материалов, потому что простой ответ здесь невозможен.

person Anoop Vaidya    schedule 14.11.2012
comment
Да, ваш ответ поставил меня на правильный путь, и у меня это работает. - person The Wanderer; 15.11.2012

Вы можете создать подкласс NSButton и переопределить performKeyEquivalent: следующим образом:

override func performKeyEquivalent(event: NSEvent) -> Bool {
    guard
        let window = window where window.firstResponder.isKindOfClass(NSText.self) == false
    else {
        return false
    }

    return super.performKeyEquivalent(event)
}

Это по существу отключает эквивалент ключа, если первым ответчиком является текстовое поле/представление.

person Berk    schedule 11.07.2016