如何在没有用户输入的情况下定期下载NSMenu

时间:2015-09-04 15:24:23

标签: objective-c macos cocoa

我在窗口顶部创建了一个状态栏菜单项,如下所示:

- (void)createStatusBarItem {
    _statusBar = [NSStatusBar systemStatusBar];
    _statusItem = [_statusBar statusItemWithLength:NSSquareStatusItemLength];
    _statusItem.image = [NSImage imageNamed:@"icon_off.png" ];
    _statusItem.highlightMode = YES;
    _statusItem.menu = [self createStatusBarMenu];
}

菜单:

- (NSMenu *)createStatusBarMenu {
    NSMenu *menu = [[NSMenu alloc] init];
    ...
}

我现在想要定期让菜单下拉,就像用户点击了状态栏图标一样。这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

确实如此。首先创建一个重复的NSTimer来重复调用一个方法并将其存储为一个属性(这样你以后就可以使它失效等)。

self.timer = [NSTimer timerWithTimeInterval: 5.0 target: self selector: @selector(displayMenu:) userInfo: nil repeats: YES];
[[NSRunLoop currentRunLoop] addTimer: self.timer forMode: NSRunLoopCommonModes];

然后在它调用的方法中,显示菜单。

[self.statusItem popUpStatusItemMenu: self.statusItem.menu];

在这种情况下,它会每5秒左右弹出一次。但是,由于您不知道它何时关闭,因此用户可以将其关闭然后进行定时器调用,并在稍后重新打开它。因此,您可能希望将自己设置为菜单的委托,并实施menuWillOpen:menuDidClose:。在menuDidClose:中你可能会重新制作计时器(或设置它的开火日期)以重置间隔,以便在菜单上次关闭之前打开菜单再等5秒钟。如果用户没有在menuWillOpen:等中自行关闭菜单,您也可以创建一个自动关闭菜单的计时器,这样菜单就会每隔X秒打开一次,如果没有任何操作则自动关闭X秒。它(你打电话给NSMenu的cancelTracking。)