2009-12-06 3 views
2

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

@implementation svsView 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

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

@end 

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

--ORIGINAL [плохо] EXAMPLE--

@implementation svsController 

//init 
//IBActions 

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

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

@end 

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

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

Спасибо за понимание, которое у вас может быть.

+0

Хорошо, я попробовал другой подход. Я создал подкласс svsView: NSView (с соответствующими .mm и .h) и попытался переопределить keyUp: (метод NSResponder (суперкласс NSView)). Вставляя простой вызов NSLog и ничего не видя из него, похоже, что метод даже не вызывается. Я пропустил что-то элементарное здесь? Thanks –

+0

IBAction предназначен для методов действий, а не для методов событий. –

+0

Спасибо, Питер. Я прикрепил IBAction и вернулся к (void) его в подклассе NSView и даже перегрузил acceptsFirstResponder, чтобы установить класс для первого ответчика, но я все еще не вижу его. Какие-либо предложения? –

ответ

1

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

2

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

+0

Спасибо, Джошуа. Я на самом деле подклассифицирую NSView, но по какой-то причине я не могу получить метод keyUp. Интересно, связано ли это с цепочкой ответчиков или с каким-то другим простым трюком, которого я пропускаю. –

+0

Я собирался предложить убедиться, что ваш подкласс возвращает YES на -acceptsFirstResponder, но я увидел ваш другой ответ. Это также вызовет проблемы. :-) –