向山狮通知中心发送通知

时间:2012-08-05 08:11:25

标签: objective-c xcode macos cocoa osx-mountain-lion

有人可以举例说明从Cocoa应用程序向通知中心发送测试通知吗?例如。当我点击NSButton

2 个答案:

答案 0 :(得分:152)

Mountain Lion中的通知由两个类处理。 NSUserNotificationNSUserNotificationCenterNSUserNotification是您的实际通知,它有标题,消息等,可以通过属性设置。要发送您已创建的通知,您可以使用NSUserNotificationCenter中提供的deliverNotification:方法。 Apple文档提供了有关NSUserNotification&的详细信息。 NSUserNotificationCenter但发布通知的基本代码如下所示:

- (IBAction)showNotification:(id)sender{
    NSUserNotification *notification = [[NSUserNotification alloc] init];
    notification.title = @"Hello, World!";
    notification.informativeText = @"A notification";
    notification.soundName = NSUserNotificationDefaultSoundName;

    [[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];
    [notification release];
}

这将生成带有标题,消息的通知,并在显示时播放默认声音。您可以使用通知进行更多操作(例如调度通知),这些都在我链接到的文档中详细说明。

一个小问题,只有在您的应用程序是关键应用程序时才会显示通知。如果您希望显示通知,无论您的应用程序是否为密钥,您都需要指定NSUserNotificationCenter的委托并覆盖委托方法userNotificationCenter:shouldPresentNotification:,以便它返回YES。可以找到NSUserNotificationCenterDelegate的文档here

以下是向NSUserNotificationCenter提供委托,然后强制显示通知的示例,无论您的应用程序是否为密钥。在应用程序的AppDelegate.m文件中,编辑它:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
}

- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center shouldPresentNotification:(NSUserNotification *)notification{
    return YES;
}

在AppDelegate.h中,声明该类符合NSUserNotificationCenterDelegate协议:

@interface AppDelegate : NSObject <NSApplicationDelegate, NSUserNotificationCenterDelegate>

答案 1 :(得分:0)

@alexjohnj的答案已针对Swift 5.2更新

在AppDelegate中

func applicationDidFinishLaunching(_ aNotification: Notification) {

  // Set delegate
  NSUserNotificationCenter.default.delegate = self
}

然后确认为NSUserNotificationCenterDelegate为

extension AppDelegate: NSUserNotificationCenterDelegate {
 func userNotificationCenter(_ center: NSUserNotificationCenter, shouldPresent notification: NSUserNotification) -> Bool {
    true
}}