Событие keyUp слышно ?: Переопределенный метод NSView

ОБНОВЛЕНО: теперь я переопределяю метод NSView keyUp из подкласса NSView, установленного для первого респондента, как показано ниже, но я все еще не вижу доказательств того, что он вызывается.

@implementation svsView

- (BOOL)acceptsFirstResponder {
    return YES;
}

- (void)keyUp:(NSEvent *)event {
  //--do key up stuff--
  NSLog(@"key up'd!");
}

@end

--ORIGINAL POST - Я новичок в Cocoa и Obj-C, и я пытаюсь выполнить (void) keyUp: из реализации моего класса контроллера (который сам имеет тип NSController). Я не уверен, что это подходящее место для его размещения. У меня есть ряд одинаковых кнопок, каждая из которых имеет уникальный ключевой эквивалент (атрибут кнопки IB), и каждая вызывает мой (IBAction) метод keyInput, который затем передает идентификатор каждого ключа другому объекту. Это работает нормально, но я также хочу отслеживать, когда каждая клавиша отпускается.

--ОРИГИНАЛЬНЫЙ [плохой] ПРИМЕР -

@implementation svsController

//init
//IBActions

- (IBAction)keyInput:(id)sender {
  //--do key down stuff--
}

- (void)keyUp:(NSEvent *)event {
  //--do key up stuff--
}

@end

В случае неудачи я также попробовал keyUp как IBAction (вместо void), как и определяемый пользователем keyInput, и подключил его к соответствующим кнопкам в Interface Builder, но тогда keyUp вызывался только тогда, когда ключи были выключены, а не когда выпустят. (Что, как я предполагал, должно было случиться.)

Простите за глупость, но следует ли мне поместить этот метод в другой класс или сделать что-то по-другому? Однако где бы он ни был, мне нужен доступ к объектам, принадлежащим классу контроллера.

Спасибо за любую информацию, которая у вас есть.


person Old McStopher    schedule 06.12.2009    source источник
comment
Хорошо, я попробовал другой подход. Я создал подкласс svsView: NSView (с соответствующими .mm и .h) и попытался переопределить keyUp: (метод NSResponder (суперкласс NSView)). Вставив простой вызов NSLog и ничего не увидев в нем, кажется, что метод даже не вызывается. Неужели я здесь чего-то элементарного упускаю? Спасибо   -  person Old McStopher    schedule 06.12.2009
comment
IBAction предназначен для методов действий, а не для методов событий.   -  person Peter Hosey    schedule 06.12.2009
comment
Спасибо, Питер. Я отклонил IBAction и вернулся к (аннулированию) его в подклассе NSView и даже переопределил acceptFirstResponder, чтобы установить класс в качестве первого респондента, но я все еще не вижу, как он вызывается. Какие-либо предложения?   -  person Old McStopher    schedule 06.12.2009
comment
С тех пор я открыл и построил простой пример для разработчиков DotView, который переопределяет метод mouseUp: NSView. При добавлении метода keyUp: он просто NSBeeps при нажатии клавиш так же, как и без keyUp. Итак, я думаю, это как-то связано с тем, какие объекты могут прослушивать ключевые события или какой-либо атрибут, который необходимо установить ... Хорошо, подождите, просто запустил пример BlastApp, который явно имеет события keyUp. Он NSBeeps на недействительных ключах, так что это хорошее место для начала. Я просто не вижу, что определяет, будет ли / когда событие будет услышано.   -  person Old McStopher    schedule 06.12.2009


Ответы (2)


Подклассы NSResponder (такие как настраиваемый подкласс NSView) обрабатывают ключевые события. Они даже обрабатывают события более абстрактного уровня, такие как «перемещение влево / вправо», «вставка новой строки» и т. Д. Затем они могут отправить сообщение контроллеру, чтобы тот ответил соответствующим образом.

person Joshua Nozzi    schedule 06.12.2009
comment
Спасибо, Джошуа. Фактически я создаю подкласс NSView, но по какой-то причине я не могу вызвать метод keyUp. Интересно, связано ли это с цепочкой респондентов или каким-то другим простым трюком, который мне не хватает. - person Old McStopher; 06.12.2009
comment
Я собирался предложить убедиться, что ваш подкласс возвращает YES на -acceptsFirstResponder, но я видел ваш другой ответ. Это тоже вызовет проблемы. :-) - person Joshua Nozzi; 06.12.2009

Вау! Я думаю, что у меня получилось. Мне просто нужно было создать экземпляр моего подкласса со ссылкой NSView / NSWindow на класс в IB. Фактически не создавал его экземпляр в пользовательском интерфейсе. Последние несколько часов в дерьме! Без того, что я кое-что узнал по пути. ;)

person Old McStopher    schedule 06.12.2009