Как перестать слушать NSEvents?

У меня проблема с прослушиванием событий, я могу прослушивать события, которые отлично работают, однако я не могу заставить его прекратить прослушивание событий. Я исследовал это некоторое время и придумал метод + (void)removeMonitor:(id)eventMonitor, который он говорит, что я должен использовать, когда я закончу с слушателем

Но когда я пытаюсь использовать метод, вот так

[NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event) {
    [NSEvent removeMonitor:event];
}];

Я продолжаю получать сообщение об ошибке «-[NSEvent недействительно]: в экземпляр отправлен неизвестный селектор», который я также исследовал, и я считаю, что это означает, что я перезаписываю используемую память. Однако я не знаю, как решить эту проблему. Любые предложения или помощь очень ценятся!

ОБНОВЛЕНИЕ Благодаря JWWalker, Samir и Abizern, теперь это работает

//I made a global variable called eventHAndler

.h файл

id eventHAndler

.м файл

eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event){
///code 
}];

/// created another method called stop. When called it stops the eventHAndler
- (IBAction)Stop:(id)sender 
{
    stop = 1;
    NSLog(@"inside stop method");
    [NSEvent removeMonitor:eventHAndler];
}

person A.sharif    schedule 19.08.2012    source источник


Ответы (2)


Вы передаете неверную информацию removeMonitor:. Вызов +[NSEvent addGlobalMonitorForEventsMatchingMask: handler:] возвращает значение, называемое объектом обработчика событий. Это то, что можно передать removeMonitor:.

person JWWalker    schedule 28.08.2012
comment
Извините, я все еще немного запутался. Как получить возвращаемое значение для +[NSEvent addGlobalMonitorForEventsMatchingMask: handler:^(NSEvent *event)]? - person A.sharif; 28.08.2012
comment
@A.sharif, если вы имеете в виду, как получить его в блоке, который обрабатывает событие, то, честно говоря, я не знаю, я никогда не использовал блоки. - person JWWalker; 28.08.2012
comment
JWWalker прав. Что-то вроде: id eventHAndler = [NSEvent addGlobalMonitorForEventsMatchingMask: handler:]; .... [NSEvent removeHandler:eventHAndler] Убедитесь, что вы удалили обработчик только один раз, иначе вы можете столкнуться с проблемами памяти. - person Samir; 29.08.2012
comment
Это не работает и даже не инициализирует keyDownMask и MouseDownMask. Я запускаю этот метод [NSEvent addGlobalMonitorForEventsMatchingMask:(NSLeftMouseDownMask|NSKeyDownMask) handler:^(NSEvent *event) { ///куча кода }]; Он запускает и выполняет код в зависимости от того, что нажимает пользователь. Моя проблема в том, что метод продолжает работать, несмотря ни на что. Допустим, пользователь хочет остановить программу и нажимает кнопку остановки, которая должна отправить инструкцию остановки в метод addGlobalMonitorForEvents. Разве для этого метода нет простой инструкции по остановке? - person A.sharif; 30.08.2012
comment
Чувак, а каков правильный синтаксис ответа? Я могу только догадываться! - person Parth Sane; 14.11.2015
comment
@Boggartfly, @A.sharif, я думаю, если бы вы сказали __block id eventHandler = [NSEvent ..., то обработчик события был бы доступен внутри блока обработчика. - person JWWalker; 17.11.2015

Согласно: http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/EventOverview/MonitoringEvents/MonitoringEvents.html

Они говорят:

Глобальный монитор событий ищет события пользовательского ввода, отправленные приложениям, отличным от того, в котором он установлен. Монитор не может изменить событие или предотвратить его нормальную доставку. И он может отслеживать ключевые события только в том случае, если доступность включена или если приложению доверяют доступность.

Так что это невозможно, говорит сам мужчина :P

person SimplyKiwi    schedule 28.08.2012
comment
Я не пытаюсь остановить действие. Я пытаюсь перестать это слушать. По сути, моя проблема в том, что моя программа входит в цикл, который просто слушает. Я хочу оставить эту петлю. В процитированном вами комментарии говорится об изменении того, что вводит пользователь, а это не то, что я пытаюсь сделать. - person A.sharif; 28.08.2012
comment
Если вы просто пытаетесь перестать слушать это, почему бы просто не использовать простой BOOL или что-то подобное и проверить, да это или нет, и сделать то, что уместно. - person SimplyKiwi; 28.08.2012
comment
Я не могу выйти из цикла с помощью оператора return или break, поэтому логический оператор не поможет мне, если я не знаю, как выйти из цикла. - person A.sharif; 28.08.2012
comment
Я не слишком хорошо разбираюсь в этой области, поэтому, если вы хотите, чтобы я удалил свой пост, просто дайте мне знать. Другой отвечающий, кажется, знает, о чем говорит. :) - person SimplyKiwi; 28.08.2012