Клавиша Escape тесно связана с классом cancelOperation
NSResponder
.
Попробуйте создать подкласс вашего NSWindow
и укажите для него следующий метод:
- (void)cancelOperation:(id)sender {
if (![SomeController doSomeAction]) {
[super cancelOperation:sender];
}
}
Ваше окно будет реагировать на клавишу Escape и вызывать doSomeAction
. Это был бы метод, который ваш NSMenuItem
хотел бы вызвать, но он отказался это сделать:)
В методе doSomeAction
вы должны вернуть логическое значение, указывающее, действительно ли действие действительно что-то сделало. Если это так, хорошо. Если этого не произошло (и было возвращено NO
), ваш NSWindow
передаст событие Escape-ключ следующему респонденту в цепочке.
Мне нравится это решение, потому что оно дает пользователю звуковую обратную связь о том, действительно ли его нажатие клавиши что-то сделало. Потому что, если ваш метод ничего не делал, и никакой другой репсондер ничего не делал, будет какой-то "звуковой сигнал".
Обратите внимание, что в NSView
без прикрепленного окна вам, возможно, придется использовать [self nextResponder]
вместо super
.