2015-12-22 5 views
4

В настоящее время, когда я создаю NSUserNotification, используя стиль Alert, он не будет скрываться, если я его не закрою вручную.Скрыть NSUserNotification через определенное время

enter image description here

Есть ли способ я могу автоматически закрыть/скрыть это сказать, через 2 секунды?

NSUserNotification код для справки:

let notification:NSUserNotification = NSUserNotification() 
notification.title = "Title" 
notification.subtitle = "Subtitle" 
notification.informativeText = "Informative text" 

notification.soundName = NSUserNotificationDefaultSoundName 

notification.deliveryDate = NSDate(timeIntervalSinceNow: 10) 
notification.hasActionButton = false 
let notificationcenter:NSUserNotificationCenter = NSUserNotificationCenter.defaultUserNotificationCenter() 
notificationcenter.scheduleNotification(notification) 

ответ

4

На самом деле это очень просто сделать, используя метод NSObject performSelector:withObject:afterDelay:.

Поскольку вы планируете доставку уведомлений через определенный промежуток времени, вам необходимо добавить дополнительную задержку перед увольнением до начальной задержки перед доставкой. Здесь я написал их как константы за 10 секунд до доставки и за 2 секунды до увольнения:

let delayBeforeDelivering: NSTimeInterval = 10 
let delayBeforeDismissing: NSTimeInterval = 2 

let notification = NSUserNotification() 
notification.title = "Title" 
notification.deliveryDate = NSDate(timeIntervalSinceNow: delayBeforeDelivering) 

let notificationcenter = NSUserNotificationCenter.defaultUserNotificationCenter() 

notificationcenter.scheduleNotification(notification) 

notificationcenter.performSelector("removeDeliveredNotification:", 
    withObject: notification, 
    afterDelay: (delayBeforeDelivering + delayBeforeDismissing)) 
+0

Awesome. Благодарю. Это прекрасно работает. –

+0

Что делать, если вы хотите оставить его в центре уведомлений? (Просто удалите всплывающее окно) есть ли способ сделать это? –

0

Blockquote Есть ли способ я могу автоматически закрыть/скрыть это сказать, через 2 секунды?

Нет, у вас нет такого варианта до OSX 10.11, возможно, в будущем Apple может предоставить.

Есть три способа пользователь может настроить NSUserNotification также известный как Growl уведомления:

  1. None
  2. Баннер
  3. оповещения

Вы, как разработчик не может контролировать над настройки системы. Это позволяет пользователю включать или отключать и выбирать, какое уведомление он любит.

Если вы хотите, чтобы какое-либо предупреждение отображалось пользователю, вы можете создать собственное окно оповещения и показать его в этом углу. Вы можете установить таймер для закрытия или предоставить кнопку действия, чтобы закрыть его, когда вам нужно.

Обновление 1: Какао обеспечивает NSWindow & NSPanel (ИЛС и нормальная панель). Вы можете настроить окно или панель в соответствии с вашими потребностями. Проверьте, есть ли несколько вариантов, которые помогут вам сформировать согласно вашему требованию.

Если вы не можете получить, что вы хотели закругленный угол, то вам нужно настроить окно/вид и т.д.

+0

Hi Anoop, Спасибо за ваш ответ. Вы предложили использовать окно пользовательских предупреждений? Можете ли вы предложить, на что я должен смотреть на это? Я изучал новое приложение MS Outlook 2016, оно реализовало какое-то предупреждение, которое выглядит как по умолчанию, но не является стандартным. Он также автоматически скрывается. Так может быть даже он использует аналогичный подход –

1

Вы можете использовать removeDeliveredNotification: или removeAllDeliveredNotifications с таймером

// Clear a delivered notification from the notification center. If the notification is not in the delivered list, nothing happens. 
- (void)removeDeliveredNotification:(NSUserNotification *)notification; 

// Clear all delivered notifications for this application from the notification center. 
- (void)removeAllDeliveredNotifications; 

OS X (10.8 и более поздние)

+0

Привет Параг, спасибо за это.Поэтому я попытался использовать это, но, к сожалению, это не сработает. Вот мой код, который я добавил после моего предыдущего кода. пусть секунды = 15,0 задержки ЛПЭ = секунды * Двойной (NSEC_PER_SEC) // наносекунд в секунды пусть dispatchTime = dispatch_time (DISPATCH_TIME_NOW, Int64 (задержки)) dispatch_after (dispatchTime, dispatch_get_main_queue(), { теста- переменных = NSUserNotificationCenter .removeAllDeliveredNotifications (notificationcenter) печать (тест) }) –

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