У меня есть окно с двумя NSButtons и NSTextField вместе с несколькими представлениями и несколькими другими элементами управления. Я назначаю клавиши со стрелками вправо и влево для каждой из двух кнопок NSButton. Две кнопки реагируют на клавиши со стрелками вправо и влево. Однако, находясь в NSTextField, я хочу, чтобы клавиши со стрелками работали, как обычно, в текстовом поле, а не запускали NSButtons. Я попытался прочитать документацию по обработке ключей Cocoa и другие вопросы, касающиеся ключевых событий, но я не смог найти пример попытки изменить эквивалентное поведение ключа в одном элементе управления. Я попытался создать подкласс NSTextField, но не смог перехватить клавиши со стрелками. Как это можно реализовать?
Эквивалент ключа переопределения для NSButton в NSTextField
Ответы (2)
Вы можете переопределить beFirstResponder: и в своей реализации вызвать setKeyEquivalent:. Если вы хотите удалить эквивалент ключа, когда кнопка теряет статус первого ответившего, переопределите resignFirstResponder:.
Сделайте это в элементе управления, статус первого респондента которого вы хотите изменить на эквивалент кнопки. Например, если у вас есть представление в виде контейнера, и оно может стать первым ответчиком, вы должны переопределить -becomeFirstResponder: (вызов super), а затем управлять там эквивалентом кнопки. Если вы еще не разбираетесь в этих темах, вам нужно прочитать много обязательных материалов, потому что простой ответ здесь невозможен.
Вы можете создать подкласс 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)
}
Это по существу отключает эквивалент ключа, если первым ответчиком является текстовое поле/представление.