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: (взято из этого ответа).

0 ответов

Другие вопросы по тегам