keyDown: не вызывается в подклассе NSClipView
Мое приложение не основано на документах, а его единственным окном управляет пользовательский XIB NSWindowController
подкласс, который я создаю в коде делегата приложения:
- (void) applicationDidFinishLaunching:(NSNotification*) aNotification
{
_mainWindowController = [MainWindowController new];
// (stored in ivar just to prevent deallocation)
//[_mainWindowController showWindow:self];
// ↕︎ Not sure about the difference between these two... both seem to work.
[[_mainWindowController window] makeKeyAndOrderFront:self];
}
Я подкласс NSClipView
"центрировать содержимое в представлении прокрутки" (вместо того, чтобы привязывать его к левому нижнему углу), когда он масштабируется до размера, меньшего, чем представление клипа, а также реализовывать пользовательские функции при перетаскивании мышью и т. д.
У моего окна есть строка заголовка.
Мое окно не без границ (я думаю), поэтому я не делаю подклассы NSWindow
,
Я переопределил -acceptsFirstResponder
, -canBecomeKeyView
а также -becomeFirstResponder
в моем NSClipview
подкласс (все возвращают YES
).
События перетаскивания вызывают -mouseDown:
и т. д., и если я установлю там точку останова, первый респондент в этой точке будет таким же, как окно, в котором хранится мой просмотр клипа: [self.window firstResponder]
а также [self window]
дать тот же адрес памяти.
Что мне не хватает?
Обновить
Я собрал минимальный проект, воспроизводящий мои настройки.
Я обнаружил, что если мой пользовательский вид является основным видом окна, -keyDown:
называется без проблем. Но если я помещу представление прокрутки и заменим его представление клипа своим собственным представлением (для этого мне нужно изменить базовый класс с NSView
в NSClipView
, конечно!), -keyDown:
больше не срабатывает.
Я предполагаю, что это как-то связано с тем, как NSScrollView
управляет событиями (однако, как я уже говорил, -mouseDown:
, -mouseDragged:
и т. д., кажется, не затронут).
Я также обнаружил, что я могу переопределить -keyDown:
в моем контроллере окна, и это, кажется, работает, поэтому я решил сделать именно это (хотя все еще открыт для ответа). Кроме того, поскольку я пытаюсь определить только клавишу Shift (не как модификатор другой клавиши), я бы лучше использовал:
- (void) flagsChanged:(NSEvent *) event
{
if ([event modifierFlags] & NSShiftKeyMask) {
// Shift key is DOWN
}
else{
// Shift key is UP
}
}
...вместо -keyDown:
/ -keyUp:
(взято из этого ответа).