Использовать NSWorkspaceDidWakeNotification для активации метода?

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

#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

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


Ответы (1)


Вместо [[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.

person xyz    schedule 02.03.2012
comment
Хорошо, моя проблема заключалась в том, что мне нужно было поместить NSWorkspace в метод awakeFromNib. Теперь все работает. Спасибо за подсказку. Мне больше ничего не нужно было менять. - person wigging; 02.03.2012
comment
При регистрации для уведомлений о пробуждении и сне обязательно следует использовать центр уведомлений общего рабочего пространства. Поскольку ваш ответ был принят, вам следует отредактировать его, чтобы не сбивать с толку других людей, ищущих помощи. - person Loyal Tingley; 15.08.2012
comment
Это неправильно. В образце для разработчиков на веб-сайте Apple прямо указано, что для этих уведомлений следует использовать центр уведомлений NSWorkspace, а не центр по умолчанию. См. developer.apple.com/library/mac/qa/qa1340/_index. .html - person Janus Varmarken; 01.08.2015