Как мне обработать событие mousedown внутри окна в Какао

Как мне обработать событие mousedown внутри окна в Какао?

Мой код:

-(void)mouseDown:(NSEvent *)event {
    NSLog(@"yay");
}    

Я использую Mac OS10.6 в xcode 4.0.1.

РЕДАКТИРОВАТЬ: Да, это в делегате приложения, но это мой .h:

@interface jumperAppDelegate: NSWindow {

Что я делал раньше в делегатах приложений (только не для событий мыши). Это меня реально раздражает


person Conor Taylor    schedule 30.03.2011    source источник
comment
Помимо отсутствующего ведущего - (т.е. -(void)mouseDown:), это правильно. Каков твой вопрос?   -  person Barry Wark    schedule 31.03.2011
comment
Это не сработает (извините, я пропустил - но это в моем коде).   -  person Conor Taylor    schedule 31.03.2011
comment
Вы уверены, что добавляете этот код в реализацию NSWindow? Может, вы добавили его в делегат приложения или что-то в этом роде?   -  person Gustav Larsson    schedule 31.03.2011
comment
Делегат вашего приложения наследуется от NSWindow? Это чрезвычайно странный выбор дизайна - делегат приложения - это контроллер, а не представление.   -  person Sherm Pendley    schedule 31.03.2011


Ответы (3)


Убедитесь, что вы унаследованы от NSWindow, а также соответствуете протоколу <NSWindowDelegate>. Нравится:

@interface YourWindow : NSWindow <NSWindowDelegate> {}
@end

Затем вы должны получить уведомление о событии.

-(void)mouseDown:(NSEvent *)event {    
}
person sudo rm -rf    schedule 31.03.2011
comment
На самом деле, я не уверен, нужно ли соответствовать NSWindowDelegate. В любом случае просто попробуй. - person sudo rm -rf; 31.03.2011
comment
Это все еще не работает, что странно. Я уже унаследовал NSWindow, и я сделал NSWindowDelegate, что не помогло. Я не знаю что происходит - person Conor Taylor; 31.03.2011
comment
@Conor: Вы уверены, что у вас нет какого-либо окна / представления, которое находится над тем, для которого вы пытаетесь зарегистрировать события mouseDown? Может поглощает уведомления. Также попробуйте сделать то, что сказал sosborn, а именно вернуть YES на acceptsFirstResponder. - person sudo rm -rf; 31.03.2011
comment
Я использую AppDelegate и MainWindow.xib в качестве своего окна. Единственные другие файлы, которые я добавил, - это сделать его полноэкранным. Я тоже перешел на NSWindow, но безрезультатно ... Я не знаю, что делать - person Conor Taylor; 31.03.2011
comment
@ Конор: Это твоя проблема. Ваш делегат НЕ должен наследовать от NSWindow. Вам нужно создать собственное представление (afaik) и подключить его к новому настраиваемому классу, который наследуется от NSWindow. - person sudo rm -rf; 31.03.2011
comment
О, спасибо, я не знал, что ... Спасибо за вашу помощь - РЕШЕНО! - person Conor Taylor; 31.03.2011

Чтобы этот метод был вызван классом, в котором он вызывается, необходимо унаследовать его от NSResponder. Окна и представления являются подклассами NSResponder. Если класс, из которого вы вызываете это, не является подклассом NSResponder, метод не сработает.

* Обновить * Также не забудьте переопределить acceptFirstResponder, чтобы вернуть да.

- (BOOL)acceptsFirstResponder {
   return YES;
}
person sosborn    schedule 31.03.2011

Я не знаю точно, но я слышал, что в вашем заголовочном файле (.h) вам нужно заменить «NSObject» на «NSWindow». Я бы протестировал это, но меня сейчас нет за компьютером.

Кроме того, убедитесь, что вы поместили в заголовочный файл следующий код:

- (void) mouseDown:(NSEvent*)event;

РЕДАКТИРОВАТЬ: Я провел несколько тестов и исследований, но не могу заставить его работать. Но у меня есть два совета.

  • Используйте метод '-acceptsFirstMouse.

  • Попробуйте создать NSEvent:

    NSEvent * someEvent; - (void) mouseDown: (NSEvent *) someEvent;

Скорее всего, это не сработает, но я расскажу подробнее о стрелке.

person Justin    schedule 30.03.2011
comment
Нет необходимости помещать это в файл заголовка. Это уведомление, поэтому компилятору не нужно видеть объявление заголовка. - person sudo rm -rf; 31.03.2011