В то время как другая (закрывающая) кнопка явно предназначена для отклонения уведомления, независимо от того, что может указывать его пользовательская подпись, нет элегантного способа получить уведомление, когда пользователь отклонит уведомление, нажав кнопку закрытия.
Что вы можете сделать, однако, это следить за уведомлением по умолчанию для центра уведомлений пользователя по умолчанию . Свойства: до тех пор, пока уведомление еще не было отклонено, массив будет содержать уведомление. Как только уведомление будет отклонено, массив больше не будет содержать его.
Это может быть реализовано в методе делегата NSUserNotificationCenter так:
- (void)userNotificationCenter:(NSUserNotificationCenter *)center didDeliverNotification:(NSUserNotification *)notification
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
^{
BOOL notificationStillPresent;
do {
notificationStillPresent = NO;
for (NSUserNotification *nox in [[NSUserNotificationCenter defaultUserNotificationCenter] deliveredNotifications]) {
if ([nox.identifier isEqualToString:notification.identifier]) notificationStillPresent = YES;
}
if (notificationStillPresent) [NSThread sleepForTimeInterval:0.20f];
} while (notificationStillPresent);
dispatch_async(dispatch_get_main_queue(), ^{
[self notificationHandlerForNotification:notification];
});
});
}
Этот код будет проверять, если уведомление по-прежнему есть каждые 200 миллисекунд. Как только он исчезнет, в основном потоке будет вызываться метод -notificationHandler: method, который является просто методом обратного вызова.
В этом обычном методе -notificationHandler: вы можете проверить, вызван ли метод NSAserNotificationCenter isActivateNotification: delegate для уведомления. Если этого не произошло, пользователь, скорее всего, нажал кнопку закрытия уведомления.
Это не является отказоустойчивым, так как пользователь также может отклонить уведомление иным образом, то есть без нажатия кнопки закрытия.
Я попробую ваше решение. Однако, что передано свойствоNotifications? Не могли бы вы ссылаться на какую-то документацию? Это недокументировано? Я не нашел через Интернет. – URB
Спасибо за помощь. Теперь я получаю эту идею, и я попробовал ваше решение. Я также понимаю, что это свойство deliverNotifications. Теперь что такое «идентификатор»? Вы имеете в виду какое-то определенное свойство? что мне нужно определить на этом объекте? XCode говорит, что свойство не найдено на объекте NSUserNotification. Извините, но я немного новичок в этом вопросе. – URB
К сожалению, свойство идентификатора является новым в OS X 10.9, и оно не правильно документировано в документах, см. Файл заголовка класса. Короче говоря, это экземпляр NSString, который вы можете использовать для произвольного идентификатора, если хотите. Из файла заголовка: «Этот идентификатор используется для уникальной идентификации уведомления. Уведомление, отправленное с тем же идентификатором, что и существующее уведомление, заменяет это уведомление, а не отображает новое». – Tim