Кто-нибудь знает, как лучше всего предотвратить закрытие NSPanel
клавишей escape, когда это ключевое окно? Моя панель является дочерним окном, и я хочу, чтобы она вела себя как полупостоянная часть окна, больше как ящик, а для текстовых элементов управления в ней я хочу, чтобы клавиша Escape отменяла редактирование.
Недавно я нашел больше информации об окнах и клавише Escape в документации Cocoa. В ссылке на класс NSResponder под cancelOperation:
, где говорится, что «окно отправляет сообщение о действии по умолчанию cancelOperation:
первому ответчику, а оттуда сообщение перемещается вверх по цепочке ответчиков». Похоже, что для NSPanel
все по-другому, и окно закрывается без первого ответчика, получающего вызов cancelOperation:
, или делегатов NSTextView, получающих свой вызов doCommandBySelector:
.
Мои знания о входах и выходах цепочки респондентов позорны, учитывая, что я работаю с OS X так долго, как я. Я думал, что мне нужно заставить keyDown:
в моем подклассе NSPanel
вести себя как обычное окно. Я попытался переопределить NSPanel
и смог перехватить keyDown:
, перенаправив вызов на keyDown:
NSWindow
вместо super
, но изменений не было, Escape по-прежнему закрывал окно без сообщений первому ответившему. Было ли вообще разумно пытаться?
Затем я попытался полностью переопределить подкласс панели keyDown:
, заставив его делать следующее:
[self.firstResponder cancelOperation:self]
Я бы подумал, что это позволит моему текстовому полю обрабатывать побег, как оно обычно ожидает, и, возможно, если бы текстовое поле не было первым ответчиком, вызов зашел бы в тупик. Однако я попробовал, и панель просто закрывается, как и раньше. Очевидно, я не перехватываю вещи на правильном уровне.
Кто-нибудь знает, какова последовательность методов, которые запускаются между событиями нажатия клавиши низкого уровня и закрытием панели, или что мне нужно переопределить, чтобы перехватить его и убедиться, что cancelOperation:
переходит к моему первому ответчику?