2012-03-01 7 views
2

Я создал простое приложение, чтобы узнать, как использовать NSWorkspaceWillSleepNotification и NSWorkspaceDidWakeNotification. Моя цель - вызвать метод, когда компьютер спит и просыпается. Приложение, которое я создал, соответствующим образом изменит каждую метку. После создания приложения я запускаю его с рабочего стола. После запуска приложения я заставляю компьютер спать. Когда компьютер просыпается, метки в приложении не меняются. Я добавил кнопки IBAction в окно, чтобы убедиться, что метки будут меняться. При нажатии кнопок метки действительно меняются. Но я хочу, чтобы что-то подобное происходило автоматически во сне и после пробуждения. Что я делаю не так?Использовать NSWorkspaceDidWakeNotification для активации метода?

#import "Controller.h" 

@implementation Controller 

- (void)fileNotifications { 

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 
                  selector: @selector(makeSleep:) 
                   name: NSWorkspaceWillSleepNotification 
                  object: nil]; 

    [[[NSWorkspace sharedWorkspace] notificationCenter] addObserver: self 
                  selector: @selector(makeWake:) 
                   name: NSWorkspaceDidWakeNotification 
                  object: nil]; 
} 

- (IBAction)makeSleep:(id)sender { 
    [sleepLabel setStringValue:@"Computer Slept!"]; 
} 

- (IBAction)makeWake:(id)sender { 
    [wakeLabel setStringValue:@"Computer Woke!"]; 
} 


@end 
+0

В то время как ваш код, скорее всего, не сбой, вы должны использовать уведомление '- (void) makeSleep: (NSNotification *); вместо' - (IBAction) makeSleep: (id) sender'. поскольку методы обратного вызова для наблюдения служат совершенно другой цели, чем ** IBActions **. Тот факт, что это работает, просто благодаря тому, что они имеют один и тот же шаблон выбора (то есть метод с одним аргументом id/object). – Regexident

ответ

0

Вместо [[NSWorkspace sharedWorkspace] notificationCenter] попробуйте использовать [NSNotificationCenter defaultCenter]

так:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(makeSleep:) NSWorkspaceWillSleepNotification object:nil ];

и

[[NSNotificationCenter defaultCenter] addObserver:self @selector(makeWake:) NSWorkspaceDidWakeNotification object:nil ];

Вышеуказанное неверно, см. https://developer.apple.com/library/mac/qa/qa1340/_index.html

Использование [[NSWorkspace sharedWorkspace] notificationCenter] необходимо.

Вы должны добавить наблюдателей по - (void)awakeFromNib методу.

+0

Хорошо, моя проблема в том, что мне нужно было поставить 'NSWorkspace' в метод' awakeFromNib'. Сейчас все работает. Спасибо за подсказку. Мне не нужно было ничего менять. – wigging

+4

При регистрации на уведомления о пробуждении и сне, абсолютно необходимо использовать центр уведомлений общего рабочего пространства. Поскольку ваш ответ был принят, вы должны отредактировать его, чтобы вы не путали других людей, которые искали помощь. –

+1

Это просто неправильно. В образце разработчика на веб-сайте Apple явно указано, что следует использовать центр уведомлений NSWorkspace, а не центр по умолчанию для этих уведомлений. См. Https://developer.apple.com/library/mac/qa/qa1340/_index.html. –

 Смежные вопросы

  • Нет связанных вопросов^_^